2016-12-02 133 views
0

我擁有相同的數據庫模式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相同的數據庫架構。

回答

0

有一些限制:

  1. @Transactional對應於單一事務管理。
  2. JpaTransactionManager對應於單個EntityManager(工廠)。

因此使用帶有@Transactional註釋單獨的方法爲每個事務經理:

@Transactional(transactionManager = "tmBeanName") 

該實體管理器後,將正常工作。


而且,一些解決方法存在打破第二限制(不使用IT在這種情況下):

,能夠使用單JtaTransactionManager而不是幾個JpaTransactionManager:分佈式事務將覆蓋兩個實體管理器,它們也可以正常工作。

相關問題