java - 通过JTA配置Spring + Hibernate JPA事务管理器

标签 java spring hibernate jpa

我之前使用 RESOURCE-LOCAL 事务类型为 Hibernate 配置了此配置:

持久性.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 session 。

那么如何配置 Spring 和 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>

最佳答案

我遇到了类似的问题,最后我解决了,正如您在这个小演示中看到的那样: https://github.com/miguelangelprogramacion/spring4_jpa_hibernate

以[1]为引用,我更喜欢在JTA之前使用Spring的事务支持。

此外,我还使用了基于注释的方法。

[1] http://spring.io/blog/2011/08/15/configuring-spring-and-jta-without-full-java-ee/

关于java - 通过JTA配置Spring + Hibernate JPA事务管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27013353/

相关文章:

java - 通过 .handle() 配置服务激活器的输出 channel

Java TargetDataLine 没有接收到任何音频?

java - 在eclipse中找不到作为junit测试运行

java - hibernate 条件来获取记录?

java - 双击按键绑定(bind) Java

java - 使用RestTemplate调用 Controller

spring - Spring中@Order注解有什么用?

javascript - Node.js HTTP GET “ECONNRESET” 读取错误

java - 我必须将 hibernate 设置为 weblogic 吗?

java - hibernate 内存泄漏