使用 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-jdbcspring-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 服务中

在 Spring Boot 应用程序的 JUnit 测试中,自动装配的 JPA 存储库没有合格的 bean

Spring Boot 构造函数自动装配异常

Spring Boot 2 实践记录之 条件装配

无法在 Spring Boot 项目中自动装配数据源

Spring boot 自动装配