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
相关产品推荐
相关产品推荐

