Spring Data JPA多数据源配置问题:非Primary EntityManager未被仓库使用
问题分析与修复方案
你的配置存在以下几个关键问题,导致两组仓库都绑定到了@Primary标注的Postgres数据源组:
1. SQL Server配置类缺失对应@EnableJpaRepositories配置
你仅提供了Postgres的配置类,但SQL Server的配置类必须同样添加@EnableJpaRepositories注解,明确指定其仓库所在包、对应的EntityManagerFactory和TransactionManager引用。缺少该配置的话,SQL Server的仓库会默认使用@Primary的Postgres相关Bean。
补充的SQL Server配置类示例:
@EnableJpaRepositories( basePackages = "dao.sqlserver", entityManagerFactoryRef = "sqlserverEntityManagerFactory", transactionManagerRef = "sqlserverTransactionManager" ) public class SqlServerDataSourceConfigurations { @Bean @ConfigurationProperties("spring.datasource.sqlserver") public DataSourceProperties sqlserverDataSourceProperties() { return new DataSourceProperties(); } @Qualifier("sqlserverDataSource") @Bean public DataSource sqlserverDataSource() { return sqlserverDataSourceProperties().initializeDataSourceBuilder().build(); } @Bean(name = "sqlserverEntityManagerFactory") public LocalContainerEntityManagerFactoryBean entityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("sqlserverDataSource") DataSource dataSource) { return builder .dataSource(dataSource) .packages("profiles", "outbox") .persistenceUnit("sqlserverPersistenceUnit") .build(); } @Bean(name = "sqlserverTransactionManager") public PlatformTransactionManager transactionManager( @Qualifier("sqlserverEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } }
2. Postgres的@EnableJpaRepositories未指定transactionManagerRef
虽然Postgres的TransactionManager是@Primary,但为了明确绑定关系,建议在Postgres的@EnableJpaRepositories中补充transactionManagerRef参数,避免Spring自动选择时出现歧义:
@EnableJpaRepositories( basePackages = "dao.postgres", entityManagerFactoryRef = "postgresEntityManagerFactory", transactionManagerRef = "postgresTransactionManager" // 补充该参数 ) public class PostgresDataSourceConfigurations { // 原有Bean配置保持不变 }
3. 确保SQL Server仓库在正确的包路径下
SQL Server的仓库接口必须放在dao.sqlserver包下,与配置类中basePackages指定的路径完全一致,示例:
package dao.sqlserver; import domain.Address; import org.springframework.data.repository.CrudRepository; import java.util.UUID; public interface SqlServerAddressDao extends CrudRepository<Address, UUID> { }
4. 仅保留一组@Primary Bean
你的Postgres配置中核心Bean都添加了@Primary是合理的(作为默认数据源),但SQL Server的配置中绝对不能添加@Primary注解,否则会导致Spring无法区分默认Bean,引发依赖注入冲突。
内容的提问来源于stack exchange,提问作者sumek
相关产品推荐
相关产品推荐

