2016-12-05 67 views
0

我試圖使用Springboot和JPA使用多個數據源,但我嘗試啓動服務器時出現錯誤。多個數據源拋出JPA錯誤

只有當我嘗試使用我的第二個數據源時纔會出現此問題。

Not an managed type: class com.company.app.backoffice.modelDocument.Category 

都是爲了第一個數據源工作的偉大:我米試圖啓動我的應用程序時具有以下錯誤。但似乎我的第二位實體經理並沒有跟蹤這個好套餐。例如,我需要我的第一個數據源來管理我的模型包,和我的第二個管理modelDocument包:

<!-- Configure the data source bean --> 
<!-- Website datasource --> 
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${jdbc.driverClassName}"/> 
    <property name="url" value="${jdbc.url}"/> 
    <property name="username" value="${jdbc.username}"/> 
    <property name="password" value="${jdbc.password}"/> 
</bean> 

<!-- Doc base datasource --> 
<bean id="docDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="${jdbc.driverClassName}"/> 
    <property name="url" value="${jdbc.doc.url}"/> 
    <property name="username" value="${jdbc.doc.username}"/> 
    <property name="password" value="${jdbc.doc.password}"/> 
</bean> 

<!-- Configure the entity manager factory bean --> 
<!-- Website Entity manager --> 
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="packagesToScan" value="com.company.app.backoffice.model"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
</bean> 

<!-- Doc base Entity manager --> 
<bean id="docEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="docDataSource"/> 
    <property name="packagesToScan" value="com.company.app.backoffice.modelDocument"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
</bean> 

<!-- Configure the transaction manager bean --> 
<!-- Website transation manager --> 
<bean id="transactionManager" 
     class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 

<!-- Doc base transaction manager --> 
<bean id="docTransactionManager" 
     class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="docEntityManagerFactory"/> 
</bean> 

這是我需要在第二個數據源,這是在modelDocument包來管理類:

@Entity 
@Table(name = "category") 
public class Category { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    @Column 
    private String name; 


    public Long getId() { 
     return id; 
    } 

    public String getName() { 
     return name; 
    } 
} 

有沒有人知道這有什麼問題?

編輯:隱式存儲庫來管理實體持久性

package com.company.app.backoffice.repository; 

import com.company.app.backoffice.modelDocument.Category; 
import org.springframework.data.jpa.repository.JpaRepository; 

public interface CategoryRepository extends JpaRepository<Category, Long> { 
} 

編輯2:

@Controller 
public class CategoryController { 

    @Autowired 
    private CategoryRepository categoryRepository; 

    @RequestMapping(value = "/categories", method = RequestMethod.GET, produces = "application/json") 
    @ResponseBody 
    public List<Category> categories() { 
     return categoryRepository.findAll(); 
    } 
} 
+0

您可以發佈您的DAO嗎? – BrunoDM

+0

我不使用任何DAO。我只使用隱式JPA存儲庫來堅持我的實體 – mfrachet

+0

向我們展示他們的注入,因此 – BrunoDM

回答

2

包含實體

<jpa:repositories base-package="your.package.enties" /> 
0

的主要問題是,你有兩個不同的數據源和實體管理器:其中庫注入控制器使用JPARepository。我認爲當你這樣工作時,Spring會迷失方向。是隻與一個數據源/ EM工作。我已經找到了一個解決方案,將Spring的em/datasource設置爲一個特定的JPARepository,並且我還沒有找到。儘管如此,你可以按照這個tutorial來創建你自己的JPARepository實現並定義兩個類。每個人使用不同的數據源和EntityManager。這樣做,你應該達到你想要的。

+0

事實上,我有兩個實體管理器。第一個是模型,第二個是modelDocument。 – mfrachet

+0

看看新的答案 – BrunoDM

0

當你有多個數據源的附加包掃描,你將不得不宣佈獨立的事務管理器(PlatformTransactionManager)和實體管理器(LocalContainerEntityManagerFactoryBean)。所以Springboot會感到困惑。要解決此問題,請使用@Primary註釋。將此註釋放在任何一位交易經理和任何一位實體經理上

乾杯