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

Spring 4中配置对应PostgreSQL与SQL Server的双EntityManagerFactory

在Spring 4中配置双EntityManagerFactory(对应PostgreSQL和SQL Server)

没问题,我来帮你搞定Spring 4里配置两个EntityManagerFactory的事儿——分别对应PostgreSQL和SQL Server数据库。既然你已经在persistence.xml里准备好了两个持久化单元,那咱们直接从Spring的配置入手就行:

1. 先配置两个数据库的独立数据源

每个EntityManagerFactory都需要绑定专属的数据源,这里用Spring的DriverManagerDataSource做示例,你也可以换成BasicDataSource或者其他连接池实现(比如HikariCP):

<!-- PostgreSQL数据源配置 -->
<bean id="postgreDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver"/>
    <property name="url" value="jdbc:postgresql://localhost:5432/your_postgre_db"/>
    <property name="username" value="postgre_user"/>
    <property name="password" value="postgre_pass"/>
</bean>

<!-- SQL Server数据源配置 -->
<bean id="sqlServerDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
    <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=your_sqlserver_db"/>
    <property name="username" value="sqlserver_user"/>
    <property name="password" value="sqlserver_pass"/>
</bean>

2. 配置对应的EntityManagerFactory

接下来为每个数据源配置LocalContainerEntityManagerFactoryBean,核心是指定persistence.xml里对应的持久化单元名称,以及绑定的数据源:

<!-- PostgreSQL对应的EntityManagerFactory -->
<bean id="postgreEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="postgreDataSource"/>
    <property name="persistenceUnitName" value="entityManagerPostgre"/> <!-- 替换成你persistence.xml中PostgreSQL的持久化单元名 -->
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true"/>
            <property name="generateDdl" value="false"/>
        </bean>
    </property>
</bean>

<!-- SQL Server对应的EntityManagerFactory -->
<bean id="sqlServerEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="sqlServerDataSource"/>
    <property name="persistenceUnitName" value="entityManagerSqlServer"/> <!-- 替换成你persistence.xml中SQL Server的持久化单元名 -->
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true"/>
            <property name="generateDdl" value="false"/>
        </bean>
    </property>
</bean>

重要提示:这里的persistenceUnitName必须和你persistence.xml里的两个持久化单元名称完全匹配,别搞混了!

3. 配置专属事务管理器

每个EntityManagerFactory需要对应一个事务管理器,这样才能分别管控两个数据库的事务:

<!-- PostgreSQL事务管理器 -->
<bean id="postgreTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="postgreEntityManagerFactory"/>
</bean>

<!-- SQL Server事务管理器 -->
<bean id="sqlServerTransactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="sqlServerEntityManagerFactory"/>
</bean>

如果用注解式事务,直接在方法上指定对应的事务管理器即可:

@Transactional("postgreTransactionManager")
public void savePostgreData(PostgreEntity entity) {
    // 业务逻辑
}

4. 在DAO层指定使用的EntityManager

当你在DAO层注入EntityManager时,需要用@PersistenceContext指定对应的持久化单元名,或者用@Qualifier指定EntityManagerFactory:

方式一:通过持久化单元名注入EntityManager

@Repository
public class PostgreDao {

    @PersistenceContext(unitName = "entityManagerPostgre")
    private EntityManager entityManager;

    public List<PostgreEntity> findAll() {
        return entityManager.createQuery("SELECT e FROM PostgreEntity e", PostgreEntity.class).getResultList();
    }
}
@Repository
public class SqlServerDao {

    @PersistenceContext(unitName = "entityManagerSqlServer")
    private EntityManager entityManager;

    public List<SqlServerEntity> findAll() {
        return entityManager.createQuery("SELECT e FROM SqlServerEntity e", SqlServerEntity.class).getResultList();
    }
}

方式二:注入EntityManagerFactory并创建EntityManager

@Repository
public class PostgreDao {

    @Autowired
    @Qualifier("postgreEntityManagerFactory")
    private EntityManagerFactory entityManagerFactory;

    public List<PostgreEntity> findAll() {
        EntityManager em = entityManagerFactory.createEntityManager();
        try {
            return em.createQuery("SELECT e FROM PostgreEntity e", PostgreEntity.class).getResultList();
        } finally {
            em.close();
        }
    }
}

最后几个注意事项

  • 确保两个持久化单元对应的实体类是隔离的,或者在persistence.xml里明确指定每个单元要扫描的实体,避免实体冲突。
  • 项目里必须引入对应数据库的驱动包:PostgreSQL的postgresql包、SQL Server的mssql-jdbc包。
  • 如果用Spring注解配置(而非XML),逻辑是一样的,只是把XML配置换成@Bean注解即可。

内容的提问来源于stack exchange,提问作者user1188867

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:39:02