没有正在进行的交易JTA交易

时间:2012-02-16 18:13:37

标签: hibernate spring jpa jta

我是JTA的新手,我想在我的应用程序中进行两阶段提交,它将连接到两个不同的数据库模式。 我在我的应用程序中使用Spring,Hibernate和JPA,我想要开始添加JTA事务管理器,但我还没有能够解决这个问题。

有人可以帮我解决我所面临的问题,或指出我的配置或理解有什么问题。

这是我在配置文件中的设置

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="LineManagement" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false" />
            <property name="showSql" value="false" />
            <property name="databasePlatform" value="${hibernate.dialect}" />
        </bean>
    </property>
    <property name="beanName" value="entityManager"></property>
</bean>

<bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp"
    init-method="init" depends-on="setAtomikosSystemProps">
    <constructor-arg>
        <props>
            <prop key="com.atomikos.icatch.service">com.atomikos.icatch.standalone.UserTransactionServiceFactory</prop>
        </props>
    </constructor-arg>
</bean> 


<bean id="setAtomikosSystemProps" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject">
        <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
            <property name="targetClass" value="java.lang.System" />
            <property name="targetMethod" value="getProperties" />
        </bean>
    </property>
    <property name="targetMethod" value="putAll" />
    <property name="arguments">
        <util:properties>
            <prop key="com.atomikos.icatch.file">/jta.properties</prop>
            <prop key="com.atomikos.icatch.hide_init_file_path">true</prop>
            <prop key="com.atomikos.icatch.console_log_level">DEBUG</prop>
        </util:properties>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" >
        <property name="userTransaction" ref="AtomikosUserTransaction" /> 
        <property name="transactionManager" ref="AtomikosTransactionManager" /> 
</bean>


<bean id="AtomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp" depends-on="userTransactionService" >
    <property name="transactionTimeout" value="300"/>
</bean> 

<bean id="AtomikosTransactionManager" class = "com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
   <property name="forceShutdown" value="false" /> 
</bean>


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

persistence.xml具有以下配置

<persistence-unit name="LineManagement" transaction-type="JTA">

    <properties>
        <property name="hibernate.id.new_generator_mappings" value="true" />
        <property name="hibernate.current_session_context_class" value="thread" />
        <property name="hibernate.default_batch_fetch_size" value="200" />
        <property name="hibernate.transaction.manager_lookup_class" value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup"/>
        <property key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
        <!-- General Debugging -->
        <property name="hibernate.show_sql" value="false" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.generate_statistics" value="true" />

    </properties>
</persistence-unit>

当我运行应用程序时,它给了我一个例外 org.springframework.dao.InvalidDataAccessApiUsageException:没有正在进行的事务;嵌套异常是javax.persistence.TransactionRequiredException:没有事务正在进行中

我试图在@Transactional注释上使用propogation标记,因为我相信这个异常表明没有事务存在,但它没有让错误消失......

1 个答案:

答案 0 :(得分:1)

尝试在服务(或持久层)调用之前将@Transactional"Required"放在一起。确保使用的是由声明的hibernate事务管理器查找类查找的相同事务管理器。

基本上你的spring事务拦截器应该在你做任何需要事务的db操作之前启动一个事务。