英文:
Spring Hibernate JPA - No JTA TransactionSynchronizationRegistry
问题
我正在设置使用 Hibernate 5.4.13 和 Spring 5.2.5 来使用 JPA。目前还没有生效,出现了错误 "javax.persistence.TransactionRequiredException: no transaction is in progress"。
我的调试输出如下。根据谷歌搜索的结果,看起来这是一个回调类,只有在需要编写自定义钩子时才需要其中一个。
我只是想知道这是否是我问题的源头。是否有人可以确认这是不必要的?
DEBUG jta.JtaTransactionManager - 在默认 JNDI 位置 [java:comp/TransactionSynchronizationRegistry] 未找到 JTA TransactionSynchronizationRegistry。
javax.naming.NameNotFoundException: 在此上下文中未绑定名称 [TransactionSynchronizationRegistry]。无法找到 [TransactionSynchronizationRegistry]。
at org.apache.naming.NamingContext.lookup(NamingContext.java:817)
英文:
I'm setting up hibernate 5.4.13 with spring 5.2.5 to use JPA. It's not working yet with the error "javax.persistence.TransactionRequiredException: no transaction is in progress".
My debug printed the below out. Googling this it would appear it's a callback class and you only need one of these if you wish to write custom hooks.
I'm just wondering if this is the source of my problem. Can anyone confirm this is not required?
DEBUG jta.JtaTransactionManager - No JTA TransactionSynchronizationRegistry found at default JNDI location [java:comp/TransactionSynchronizationRegistry]
javax.naming.NameNotFoundException: Name [TransactionSynchronizationRegistry] is not bound in this Context. Unable to find [TransactionSynchronizationRegistry].
at org.apache.naming.NamingContext.lookup(NamingContext.java:817)
答案1
得分: 0
Suggestions:
-
您可以通过系统属性指定事务同步注册表的替代 JNDI 位置:
-Djbpm.tsr.jndi.lookup=java:comp/env/TransactionSynchronizationRegistry
-
在 Tomcat 的
<tomcat-home>/conf/context.xml
文件中进行设置:<Resource auth="Container" name="comp/env/TransactionSynchronizationRegistry"
type="javax.transaction.TransactionSynchronizationRegistry"
factory="bitronix.tm.BitronixTransactionSynchronizationRegistryObjectFactory" />
<ResourceLink global="comp/env/TransactionSynchronizationRegistry"
name="comp/env/TransactionSynchronizationRegistry" />
我们需要添加一个连接池来展示稍后 JTA 的使用情况:
<ResourceLink global="jdbc/myDB" name="jdbc/myDB" type="javax.sql.DataSource"/>
<Resource
driverClassName="org.h2.Driver"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
name="jdbc/myDB"
password=""
type="javax.sql.DataSource"
url="jdbc:h2:tcp://localhost/~/test"
username="sa"/>
现在我们需要添加实际的 JTA 相关资源,首先是 TransactionSynchronizationRegistry。
TransactionSynchronizationRegistryFactory 最终会在java:comp/env/TransactionSynchronizationRegistry
而不是像 JEE 规范要求的那样在java:comp/TransactionSynchronizationRegistry
。<Resource
name="TransactionSynchronizationRegistry"
auth="Container"
type="javax.transaction.TransactionSynchronizationRegistry"
factory="org.objectweb.jotm.TransactionSynchronizationRegistryFactory"/>
-
一个关于如何在 Web 应用程序中使用 JTA 的小例子,使用 Spring:
<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="showSql" value="false"/>
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop>
</props>
</property>
</bean>
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/myDB" resource-ref="true"/>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionSynchronizationRegistryName" value="java:comp/env/TransactionSynchronizationRegistry"/>
<property name="transactionManagerName" value="java:comp/UserTransaction"/>
</bean>
更多详情请参阅:https://codepitbull.wordpress.com/2011/07/08/tomcat-7-with-full-jta/
英文:
Suggestions:
-
you can specify alternative JNDI location for transaction synchronization registry via system properties:
-Djbpm.tsr.jndi.lookup=java:comp/env/TransactionSynchronizationRegistry
-
set up in the Tomcat
<tomcat-home>/conf/context.xml
. file:<Resource auth="Container" name="comp/env/TransactionSynchronizationRegistry"
type="javax.transaction.TransactionSynchronizationRegistry" factory="bitronix.tm.BitronixTransactionSynchronizationRegistryObjectFactory" />
<ResourceLink global="comp/env/TransactionSynchronizationRegistry"
name="comp/env/TransactionSynchronizationRegistry" />
we need to add a connection pool to showcase the usage of JTA later on:
<ResourceLink global="jdbc/myDB" name="jdbc/myDB" type="javax.sql.DataSource"/>
<Resource
driverClassName="org.h2.Driver"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
name="jdbc/myDB"
password=""
type="javax.sql.DataSource"
url="jdbc:h2:tcp://localhost/~/test"
username="sa"/>
Now we need to add the actual JTA-related resources, starting with the the TransactionSynchronizationRegistry.
TransactionSynchronizationRegistryFactory will end up at java:comp/env/TransactionSynchronizationRegistry
and not at java:comp/TransactionSynchronizationRegistry
as the JEE-spec requires.
<Resource
name="TransactionSynchronizationRegistry"
auth="Container"
type="javax.transaction.TransactionSynchronizationRegistry"
factory="org.objectweb.jotm.TransactionSynchronizationRegistryFactory"/>
A little example on how to use JTA in your webapplication via spring:
<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="showSql" value="false"/>
</bean>
</property>
<propertyname="jpaProperties">
<props>
<prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</prop>
</props>
</property>
</bean>
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/myDB" resource-ref="true"/>
<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionSynchronizationRegistryName" value="java:comp/env/TransactionSynchronizationRegistry"/>
<property name="transactionManagerName" value="java:comp/UserTransaction"/>
</bean>
More details here: https://codepitbull.wordpress.com/2011/07/08/tomcat-7-with-full-jta/
专注分享java语言的经验与见解,让所有开发者获益!
评论