You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 18:58:36