首页 文章

EJB 3.0 - > Spring - > JPA(JTA作为事务管理器)

提问于
浏览
0

我目前正在开发一个项目,包括EJB 3.0(无状态SB),JPA(Hibernate作为提供者),JTA作为事务管理器 . 应用服务器是JBoss AS 7. Spring用于集成EJB和JPA .

所有似乎都工作正常,除非EJB中发生任何异常,然后由Spring关闭持久性单元 . 在随后的请求中,再次创建持久性单元,这变得耗时并且也不应该在理想情况下发生 .

以下是配置详细信息

persistence.xml中

<persistence-unit name="test" transaction-type="RESOURCE_LOCAL">
<class>com.test.User</class>
<properties>
    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
</properties>
</persistence-unit>

spring-application-context.xml

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>

<jee:jndi-lookup id="dataSource" jndi-name="java:/datasources/test" />

<bean id="entityManagerFactory"
 class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
    <property name="generateDdl" value="false" />
    <property name="database" value="MYSQL" />
            <property name="showSql" value="true" />
            <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
    </bean>
</property>
<property name="jpaPropertyMap">
    <map>
    <entry key="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"></entry>
    <entry key="hibernate.current_session_context_class" value="jta" />
    <entry key="hibernate.connection.release_mode" value="auto" />
   </map>
</property>
<property name="persistenceUnitPostProcessors">
       <list>
        <bean class="com.transaction.processor.JtaPersistenceUnitPostProcessor">
                <property name="jtaMode" value="true"/> 
            <property name="jtaDataSource" ref="dataSource"/>
        </bean>
       </list>
    </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManagerName" value="java:/TransactionManager"></property>
<property name="autodetectUserTransaction" value="false"></property>
</bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

类JtaPersistenceUnitPostProcessor负责将事务类型设置为JTA,将数据源设置为jta-datasource .

任何人都可以提供任何帮助 .

提前致谢 .

2 回答

  • 0
    <bean id="transactionManager"
        class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManagerName" value="java:jboss/TransactionManager" />
        <property name="userTransactionName" value="java:comp/UserTransaction" />
      </bean>
    
     <tx:annotation-driven transaction-manager="transactionManager" />
    
    
     <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
    

    您没有指定任何错误消息 . 您可以在配置文件中添加这些行 .

  • 0

    我看到你使用JTA事务管理器,只有在使用分布式事务并使用JNDI时才使用它 . JTA tran . 管理器通过从JNDI数据源获取的连接侦听TX . 如果您在代码中创建了数据源,并且该数据源不是Web容器的一部分,但在应用程序内部受限 . 在您的Web服务器中的容器,JTA不会工作 .

    如果您想在一个应用程序中实现Tx管理器 . 上下文适用于非常可靠的JPA事务管理器 .

相关问题