我是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标记,因为我相信这个异常表明没有事务存在,但它没有让错误消失......
答案 0 :(得分:1)
尝试在服务(或持久层)调用之前将@Transactional
与"Required"
放在一起。确保使用的是由声明的hibernate事务管理器查找类查找的相同事务管理器。
基本上你的spring事务拦截器应该在你做任何需要事务的db操作之前启动一个事务。