使用 Spring Boot 自动装配具有 jpa 和非 jpa 特征的多个数据源
Posted
技术标签:
【中文标题】使用 Spring Boot 自动装配具有 jpa 和非 jpa 特征的多个数据源【英文标题】:Autowiring multiple data sources with jpa and non-jpa characteristics using Spring Boot 【发布时间】:2014-08-04 15:34:06 【问题描述】:我有两个数据库配置 javaconfig 类 - 一个用于 JPA 目的,带有 transactionManager() 和 entityManagerFactory() @Bean 方法,另一个配置类用于基于非 JPA JDBCTemplate 的查询提交以访问该数据库中的数据。总体思路是使用 JDBCTemplate 读取数据并在转换后将数据持久化到基于 JPA 的数据源中。我正在使用 Spring Boot 来启用自动配置。我的测试失败了:
java.lang.IllegalArgumentException: Not an managed type:
我的build.gradle
中有spring-boot-starter-jdbc
和spring-boot-starter-data-jpa
。我的直觉是这两个数据源相互冲突。对于我前面提到的两个用例(一个用于 JPA,另一个用于 JDBCTemplate),如何强制使用这些数据源?
详情(在 Dave 回复后添加):
我的服务类已用 @Service
注释,我的存储库类已用 @Repository
注释。服务使用使用 @Autowired
的存储库对象,尽管有些服务是基于 JDBCTemplate 的数据检索。
我的环境更复杂的描述如下(逻辑上):JDBCTemplate(DataSource(Database(DB2)))
-->Spring Batch Item Reader;Processors; Writer --> Service(Repository(JPADataSource(Database(H2))))
。 Spring 批处理项目处理器使用服务连接到两个数据库。对于 Spring Batch,我使用 H2 Job repo 数据库(远程)来保存作业执行详细信息。这有意义吗?对于 Spring 批处理,我使用的是 de.codecentric:spring-boot-starter-batch-web:1.0.0.RELEASE
。经过entityManagerFactory
bean not found 错误后,我想控制上述组件的接线。
【问题讨论】:
【参考方案1】:我认为这与数据源无关。日志说您有一个类型不是@Entity
的JPA 存储库。默认情况下,会自动从您定义的包中扫描存储库@EnableAutoConfiguration
。因此,控制它的一种方法是将具有该注释的类移动到不同的包中。在 Boot 1.1 中,您还可以设置“spring.data.jpa.repositories.enabled=false”来关闭扫描,如果您不想要它。或者您可以照常使用@EnableJpaRepositories
。
【讨论】:
不幸的是,当我尝试按照建议关闭扫描时,我收到了nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type repository
。
如果不查看所有代码,真的不可能解释随机的单行日志语句。如果您需要存储库,为什么要禁用它们?也许你需要分享一个项目。
我会将你添加到我的 github 合作者中。你的github用户名是什么?
我已将 dsyer 添加到我的仓库中:github.com/naruraghavan/…
我可以看到代码。您有 Spring Data 存储库和实体,但我可以看到您正在手动配置 LocalContainerEntityManagerFactoryBean
(以及 Boot 将为您做的许多其他事情),并且您正在注入“entitymanager.packages.to.scan”不指向包含任何 @Entity
类的包。以上是关于使用 Spring Boot 自动装配具有 jpa 和非 jpa 特征的多个数据源的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot 中实现通用 JPA 存储库 - 它可以自动装配到任何实体/类类型的 Spring 服务中