2016-12-02 8 views
0

私は同じデータベーススキーマdat​​abase_1とdatabase_2を持っており、これらの2つのデータベース(データベーススキーマは同じです)を設定し、どのデータベースを使用するかを決定します。
マイpersistence.xmlのは以下の通りです: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> 

どちらの永続性ユニットが同じクラスをロードします。 となりました。ここで私のデータベース-configuration.xmlは、データソースを使用して永続ユニットを構成します。データソース名datasource5てconfigure第永続ユニット名の今、このコード

<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> 

以下のように:としてデータソース名データソースの最初の永続ユニット名configare以下のように今私はエンティティ・マネージャを使用

<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データベースを使用しています。パーシスタンス・ユニット名が1番目と2番目のエンティティ・マネージャがあります。

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


@PersistenceContext(unitName="second") 
private EntityManager entityManager2; 

エンティティマネージャは、persist(オブジェクト)メソッドを使用してデータベースにデータを保存します。 entityManager.persist(project);

およびentityManager2は、persist(オブジェクト)メソッドを使用してデータをデータベースに保存します(ここでは例外なし)。しかし、データはデータベースdatbase_2に保存されません。

entityManager2.persist(project); 

私はentityManager2は、データベースとのEntityManagerにデータを保存しpersistence.xmlで第一及び第二の持続性ユニットの順序を変更する場合は、データベース内のデータを保存しません。
どのように私は同じデータベーススキーマの複数のentitymanagerを作ることができる考えがあります。

答えて

0

いくつかの制限があります。

  1. @Transactionalは、単一のTransactionManagerに対応しています。
  2. JpaTransactionManagerは、単一のEntityManager(Factory)に対応します。正常に動作することエンティティマネージャ後

    @Transactional(transactionManager = "tmBeanName") 
    

したがって、各トランザクション・マネージャの@Transactionalアノテーションで別の方法を使用します。


はまた、いくつかの問題を回避するには、第2の制限(この場合にはそれを使用しないでください)破る存在:

いくつかの代わりに、単一JtaTransactionManagerを使用することが可能ですJpaTransactionManager:分散トランザクションは両方のエンティティマネージャを対象とし、正常に動作します。

関連する問題