编程语言
首页 > 编程语言> > java-具有Spring数据的JPA

java-具有Spring数据的JPA

作者:互联网

我是Java的新手,我需要创建一个控制台应用程序,该应用程序将与4个数据库(access,vfp,mysql和sqlserver)连接.

我从hibernate.cfg.xml文件开始,并设法配置它们,每个数据库一个.然后我意识到jpa是一个更好的解决方案.因此,我将所有的休眠文件更改为具有4个持续单元的persistence.xml文件.

数据库运行良好,但是要使用它们,我必须创建很多代码.这是一个例子:

EntityManagerFactory dbPersistence = 
   Persistence.createEntityManagerFactory("oneOfMyDatabases");

EntityManager em = dbPersistence.createEntityManager();

Query query = em.createQuery("from ProductEntity").setMaxResults(10);

for (Object o : query.getResultList()) {
    ProductEntity c = (ProductEntity) o;
    System.out.println("Product " + c.getName());
}

cgPersistence.close();

我需要使用其他数据库中的数据更新其中一个数据库.

创建所有这样的代码是一件很痛苦的事情,因此我在考虑创建存储库,但是我看不到如何为每个数据库使用不同的entityManagers创建存储库.

我试图用谷歌guice注入管理器,但没有成功,但是我无法处理如何关闭持久化连接或在哪里关闭持久化连接.

最终,我找到了Spring Data,它似乎是我所需要的,但我并不真正了解如何使用它.

我需要一些指导才能使其正常工作,因为我已经阅读了大量的教程,并且每个教程似乎都不相同:
·我可以使用相同的persistence.xml还是需要其他配置文件?我已经看到Spring Data具有jpa兼容性,但是我不确定它是如何工作的.
·Spring Context是Spring框架的IOC容器吗?我需要它与Spring Data一起使用吗?
·我还需要什么?

先感谢您

解决方法:

每个数据库将由不同的数据源表示.对于每个数据源,您都需要一个不同的会话工厂/实体管理器工厂.

如果要在一个事务中保存多个数据源,则需要XA事务,因此需要Java EE或独立的事务管理器,例如Bitronix或Atomikos.

您有4个不同的实体管理器工厂,每个工厂还需要特定的存储库:

<jpa:repositories base-package="your.company.project.repository.access" entity-manager-factory-ref="accessEntityManagerFactory"/>

<jpa:repositories base-package="your.company.project.repository.sqlserver" entity-manager-factory-ref="sqlserverEntityManagerFactory"/>

然后,您的应用程序不必关心它使用哪个存储库.

JpaTransactionManager需要一个entityManagerFactory,但是由于您有4个,所以最终可能要为其中的一个创建一个,我认为这是不希望的.

最好改用JTA:

<!-- 1. You define the Bitronix config ->
<bean id="btmConfig" factory-method="getConfiguration" class="bitronix.tm.TransactionManagerServices">
    <property name="serverId" value="spring-btm"/>
    <property name="warnAboutZeroResourceTransaction" value="true"/>
    <property name="logPart1Filename" value="${btm.config.logpart1filename}"/>
    <property name="logPart2Filename" value="${btm.config.logpart2filename}"/>
    <property name="journal" value="${btm.config.journal:disk}"/>
</bean>

<!-- 2. You define all your data sources ->
<bean id="dataSource" class="bitronix.tm.resource.jdbc.PoolingDataSource" init-method="init"
      destroy-method="close">
    <property name="className" value="${jdbc.driverClassName}"/>
    <property name="uniqueName" value="dataSource"/>
    <property name="minPoolSize" value="0"/>
    <property name="maxPoolSize" value="5"/>
    <property name="allowLocalTransactions" value="false"/>
    <property name="driverProperties">
        <props>
            <prop key="user">${jdbc.username}</prop>
            <prop key="password">${jdbc.password}</prop>
            <prop key="url">${jdbc.url}</prop>
        </props>
    </property>
</bean>

<!-- 3. For each data source you create a new  persistenceUnitManager and you give its own specific persistence.xml ->
<bean id="persistenceUnitManager" depends-on="transactionManager"
      class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
    <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml"/>
    <property name="defaultDataSource" ref="dataSource"/>
    <property name="dataSourceLookup">
        <bean class="org.springframework.jdbc.datasource.lookup.BeanFactoryDataSourceLookup"/>
    </property>
</bean>

<!-- JpaDialect must be configured for transactionManager to make JPA and JDBC share transactions -->
<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>

<!-- 4. For each data source you create a new entityManagerFactory ->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="persistenceUnit"/>
    <property name="persistenceUnitManager" ref="persistenceUnitManager"/>
    <property name="jpaDialect" ref="jpaDialect"/>
</bean>

<!-- 5. You have only one JTA transaction manager ->
<bean id="jtaTransactionManager" factory-method="getTransactionManager"
      class="bitronix.tm.TransactionManagerServices" depends-on="btmConfig, dataSource"
      destroy-method="shutdown"/>

<!-- 6. You have only one Spring transaction manager abstraction layer ->
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
    <property name="transactionManager" ref="jtaTransactionManager"/>
    <property name="userTransaction" ref="jtaTransactionManager"/>
</bean>

如果这对于您当前的问题证明工作量太大,则可以尝试让4位JPA事务管理器查看其工作原理.

标签:spring-data-jpa,jpa,hibernate,spring,java
来源: https://codeday.me/bug/20191121/2052845.html