[英]Multiple datasources throwing errors with JPA
我试图通过Springboot和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();
}
}
添加包含实体的软件包扫描
<jpa:repositories base-package="your.package.enties" />
主要问题是您有两个不同的数据源和实体管理器来使用JPARepository。 我认为以这种方式工作会使Spring迷失。 是仅使用一个数据源/ em。 我一直在寻找一种在Spring中将em / datasource设置为一个特定JPARepository的解决方案,但我还没有发现。 尽管如此,您仍然可以按照本教程来创建自己的JPARepository实现并定义两个类。 每个人都可以使用不同的数据源和EntityManager。 这样做,您应该实现您想要的。
如果有多个数据源,则必须声明单独的事务管理器( PlatformTransactionManager
)和实体管理器( LocalContainerEntityManagerFactoryBean
)。 因此,Springboot感到困惑。 要解决此问题,请使用@Primary
批注。 将此注释放在任何事务管理器和任何实体管理器上
干杯
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.