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