【问题标题】:Configuring Spring + Hibernate JPA Transaction Manager through JTA通过 JTA 配置 Spring + Hibernate JPA 事务管理器
【发布时间】: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 &lt;bean id="entityManager" 可能是个问题。无论如何follow this tutorial
  • 显然这行不通。您指定要使用 JTA,但在您的配置中使用本地事务。更改您的 persistence.xml 或正确配置 JTA 事务。
  • @M.Deinum 我要问的只是:如何正确配置它
  • 为什么需要 JTA 没有什么可以阻止您在 glassfish 上使用本地事务。这就是我试图提出的观点,如果它不适用于资源本地,那是因为您的设置错误。如果您不需要 JTA,请不要使用 JTA。
  • 啊。 Nice glassfish 也在尝试引导 JPA。他们在竞争。只需使用 Spring 删除您不需要的 persistence.xml,或者重命名它并将 persistenceXml 属性添加到 LocalContainerEntityManagerFactoryBean 以指定文件的新名称/位置。最简单的方法就是删除它。

标签: java spring hibernate jpa


【解决方案1】:

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

以 [1] 作为参考,我更喜欢在 JTA 之前使用 Spring 的 Transaction Support。

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

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

【讨论】:

    猜你喜欢
    • 2014-02-22
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 2017-02-05
    • 2011-07-05
    相关资源
    最近更新 更多