多个数据库Schema with Spring + Hibernate + JPA
我拥有相同的数据库模式database_1和database_2,并且希望配置这两个数据库(数据库模式相同)并决定运行时使用哪个数据库。
我的persistence.xml是如下:多个数据库Schema with Spring + Hibernate + JPA
<persistence-unit name="first" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.model.AboutUs</class>
<class>com.model.AccessCards</class>
<properties>
<property name="hibernate.dialect" value="com.util.customMySQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="none" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider" />
<property name="hibernate.jdbc.batch_size" value="20"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
</properties>
</persistence-unit>
持久名第二此处配置如下:
<persistence-unit name="second" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>com.model.AboutUs</class>
<class>com.model.AccessCards</class>
<properties>
<property name="hibernate.dialect" value="com.util.customMySQLDialect" />
<property name="hibernate.hbm2ddl.auto" value="none" />
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider" />
<property name="hibernate.jdbc.batch_size" value="20"/>
<property name="hibernate.cache.use_query_cache" value="true"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
</properties>
</persistence-unit>
两种持久化单元装载同一类。 和现在我的database-configure.xml作为我配置持久性单元与数据源的地方。如下面第一持久单元名称configare与数据源名称的数据源如:
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="persistenceUnitName" value="first" />
<property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${datasource.driverClassName}" />
<property name="jdbcUrl" value="${datasource.url}" />
<property name="user" value="${datasource.username}" />
<property name="password" value="${datasource.password}" />
<property name="acquireIncrement" value="1" />
<property name="acquireRetryAttempts" value="1" />
<property name="maxIdleTime" value="300" />
<property name="maxPoolSize" value="20" />
<property name="minPoolSize" value="3" />
<property name="maxStatements" value="300" />
<property name="testConnectionOnCheckin" value="true" />
</bean>
现在此代码为配置第二持久单元名称与数据源名称datasource5如下:
<bean id="transactionManager5" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory5" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource5" />
<property name="persistenceUnitName" value="second" />
<property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
</property>
</bean>
<bean id="dataSource5" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${datasource.driverClassName}" />
<property name="jdbcUrl" value="${datasource5.url}" />
<property name="user" value="${datasource5.username}" />
<property name="password" value="${datasource5.password}" />
<property name="acquireIncrement" value="1" />
<property name="acquireRetryAttempts" value="1" />
<property name="maxIdleTime" value="300" />
<property name="maxPoolSize" value="20" />
<property name="minPoolSize" value="3" />
<property name="maxStatements" value="300" />
<property name="testConnectionOnCheckin" value="true" />
</bean>
现在我用实体管理用于保存数据库中的数据,我正在使用mysql数据库。我有第一个和第二个持久化单元名称的实体管理器。现在
@PersistenceContext(unitName="first")
private EntityManager entityManager;
@PersistenceContext(unitName="second")
private EntityManager entityManager2;
实体管理器使用成功地坚持(对象)方法保存数据库中的数据。 entityManager.persist(project);
和entityManager2使用persist(object)方法成功地在数据库中保存数据(此处没有异常)。但数据不会存储在数据库datbase_2中。
entityManager2.persist(project);
如果我在persistence.xml中的第一和第二改变持久性单元的顺序然后entityManager2保存在数据库和数据的EntityManager不数据库中的数据保存。
任何人都有想法如何我可以使多个entitymanager相同的数据库架构。
有一些限制:
- @Transactional对应于单一事务管理。
- JpaTransactionManager对应于单个EntityManager(工厂)。
因此使用带有@Transactional注释单独的方法为每个事务经理:
@Transactional(transactionManager = "tmBeanName")
该实体管理器后,将正常工作。
而且,一些解决方法存在打破第二限制(不使用IT在这种情况下):
类=“扰流”>,能够使用单JtaTransactionManager而不是几个JpaTransactionManager:分布式事务将覆盖两个实体管理器,它们也可以正常工作。