Spring Hibernate JPA - нет JTA TransactionSynchronizationRegistry - PullRequest
0 голосов
/ 06 апреля 2020

Я настраиваю спящий режим 5.4.13 с пружиной 5.2.5 для использования JPA. Это еще не работает с ошибкой «javax.persistence.TransactionRequiredException: транзакция не выполняется».

Мой отладочный текст распечатал ниже. Погуглив это, может показаться, что это класс обратного вызова, и вам нужен только один из них, если вы хотите sh написать собственные хуки.

Мне просто интересно, является ли это источником моей проблемы. Кто-нибудь может подтвердить, что это не обязательно?

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 голосов
/ 06 апреля 2020

Предложения:

  1. вы можете указать альтернативное расположение JNDI для реестра синхронизации транзакций через системные свойства:

    -Djbpm.tsr.jndi.lookup=java:comp/env/TransactionSynchronizationRegistry
    
  2. , установленное в 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" />
    

    нам нужно добавить пул соединений для демонстрации использования 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, а не на java:comp/TransactionSynchronizationRegistry, как того требует JEE-spe c.

    Небольшой пример того, как использовать 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>
    <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"/>
    

Подробнее здесь: https://codepitbull.wordpress.com/2011/07/08/tomcat-7-with-full-jta/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...