建立兩套完整的 JPA 配置鏈:
persistence-mysql.xml、persistence-sqlserver.xmlentityManagerFactoryMySQL、entityManagerFactorySQLServertransactionManagerMySQL、transactionManagerSQLServerdataSourceMySQL、dataSourceSQLServer<!-- persistence-mysql.xml -->
<persistence-unit name="mysqlPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/db1"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
</properties>
</persistence-unit>
<!-- persistence-sqlserver.xml -->
<persistence-unit name="sqlserverPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="hibernate.connection.driver_class" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="hibernate.connection.url" value="jdbc:sqlserver://localhost:1433;databaseName=db2"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/>
</properties>
</persistence-unit>
<bean id="entityManagerFactoryMySQL" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="mysqlPU"/>
<property name="persistenceXmlLocation" value="classpath:META-INF/persistence-mysql.xml"/>
<property name="dataSource" ref="dataSourceMySQL"/>
</bean>
<bean id="transactionManagerMySQL" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactoryMySQL"/>
</bean>
<!-- SQL Server 同理,id 改為 ...SQLServer -->
@PersistenceContext(unitName="mysqlPU") 指定單元@Repository
public class UserDao {
@PersistenceContext(unitName = "mysqlPU")
private EntityManager em;
// ...
}
@Transactional("transactionManagerMySQL")JtaTransactionManager,超出單純 JPA 範疇。啟動專案,兩組 EntityManagerFactory 成功建立,分別操作對應資料庫無干擾。
核心原則:配置隔離、Bean 命名區分、註解指定單元,即可實現多資料庫共存。