【发布时间】:2014-11-19 09:35:40
【问题描述】:
我之前使用 RESOURCE-LOCAL 事务类型为 Hibernate 进行了此配置:
persistence.xml:
<persistence-unit name="myPU" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
</persistence-unit>
applicationContext(数据访问位):
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" p:entityManagerFactory-ref="entityManagerFactory"></bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="jpaAdapter" />
<property name="persistenceUnitName" value="myPU"/>
<property name="jpaProperties">
<props>
<prop key="javax.persistence.validation.mode">none</prop>
</props>
</property>
</bean>
<bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.jpa.vendor.HibernateJpaSessionFactoryBean">
<property name="entityManagerFactory" ref="entityManagerFactory" />
<!-- Are there any other properties required? -->
</bean>
<bean id="jpaAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="false" />
</bean>
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/CNTXESDB" />
<property name="lookupOnStartup" value="true" />
<property name="cache" value="true" />
<property name="proxyInterface" value="javax.sql.DataSource" />
</bean>
但是这种事务似乎不适用于 Glassfish,所以我不得不切换到 JTA 事务。
问题是——为了让 Spring 管理事务创建(通过 @Transactional)我需要定义一个 TransactionManager bean 但 spring-tx 中包含的 JtaTransactionManager 不接受 entityManagerFactory bean,所以它不知道entityManager 用于打开/关闭/刷新 Hibernate 会话的位置。
那么如何配置 Spring with Hibernate 以使用 JTA 事务?
编辑:
结果你可以在 Glassfish 中使用 RESOURCE_LOCAL 事务,但不知何故你不能有一个 persistence.xml 文件。我将此文件重命名为my_persistence.xml,并像这样配置LocalContainerEntityManagerFactoryBean:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="jpaAdapter" />
<property name="persistenceUnitName" value="myPU"/>
<property name="persistenceXmlLocation" value="classpath:META-INF/my_persistence.xml" />
<property name="jpaProperties">
<props>
<prop key="javax.persistence.validation.mode">none</prop>
</props>
</property>
</bean>
【问题讨论】:
-
我建议重命名 bean
<bean id="entityManager"可能是个问题。无论如何follow this tutorial -
显然这行不通。您指定要使用 JTA,但在您的配置中使用本地事务。更改您的
persistence.xml或正确配置 JTA 事务。 -
@M.Deinum 我要问的只是:如何正确配置它
-
为什么需要 JTA 没有什么可以阻止您在 glassfish 上使用本地事务。这就是我试图提出的观点,如果它不适用于资源本地,那是因为您的设置错误。如果您不需要 JTA,请不要使用 JTA。
-
啊。 Nice glassfish 也在尝试引导 JPA。他们在竞争。只需使用 Spring 删除您不需要的
persistence.xml,或者重命名它并将persistenceXml属性添加到LocalContainerEntityManagerFactoryBean以指定文件的新名称/位置。最简单的方法就是删除它。