Spring - @Transactional - когда будут сбрасываться данные? - PullRequest
0 голосов
/ 26 февраля 2019

Я использую Spring 4.3.4.RELEASE с Hibernate 5.1.15
В рамках перехода в спящий режим с 3 на 5 я сталкиваюсь с некоторыми проблемами, связанными с транзакциямианнотаций.

Рассмотрим случай, когда один метод содержит 2 разных метода с / без аннотации транзакции.
В hibernate 3 он работал нормально.Но после обновления до hibernate 5 метод setEMSStatus завершается сбоем, так как subscribeEms имеет значение null.

createAndSaveSubscribeedEms не сбрасывает данные в базу данных.Из-за чего setEMSStatus не получает данные из базы данных и, следовательно, получает нулевое значение.

Расширение добавления сброса будет работать.Но может быть сотни мест с подобным случаем.поэтому добавление явного сброса не выглядит жизнеспособным решением.

//Class1
@Transactional(rollbackFor = Exception.class)
public void validateAndSave(List<EmsDto> gridList) {
    //Removing unnecessary code
    emsEntityManager.createAndSaveSubscribedEms(EmsDto.getMessageName(), EmsDto.getDescription(), SubscribeEmsStatus.UNKNOWN.toString());
    //Removing unnecessary code
    emsEntityManager.setEMSStatus(entry.getKey(), SubscribeEmsStatus.VALID.toString());
}

//Class2
@Transactional
public void createAndSaveSubscribedEms(final String messageName, final String description, final String status) {
    session.save(SubscribedEms.create(messageName, description, status));
}
// Note: No transactional and it was working earlier in hibernate 3 
public void setEMSStatus(String emsName, String newStatus) {
    SubscribedEms subscribedEms = (SubscribedEms) session.createCriteria(SubscribedEms.class).
        add(Restrictions.eq(SubscribedEms_.messageName, emsName)).
        uniqueResult();
    subscribedEms.setStatus(newStatus);
}

Я сталкивался с подобной проблемой https://www.javacodegeeks.com/2013/03/migrating-from-hibernate-3-to-4-with-spring-integration.html
Но в hibernate 5.1.17 я не вижу сам этот класс.

Какие изменения я должен внести, чтобы он заработал?

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
                        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd"
        >

    <context:annotation-config />

    <context:component-scan base-package="com.company.product.da">
        <context:exclude-filter type="regex" expression="com\.company\.product\..*Test\$.*"/>
        <context:exclude-filter type="regex" expression="com\.company\.product\..*TestSupport\$.*"/>
    </context:component-scan>

    <context:component-scan base-package="com.company.product.entity.platform.event">
        <context:exclude-filter type="regex" expression="com\.companthis partct\..*Test\$.*"/>
    </context:component-scan>

    <jee:jndi-lookup id="jtaTransactionManager" jndi-name="java:/TransactionManager"/>
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" depends-on="jtaTransactionManager"/>

    <import resource="classpath:spring/database-common.xml"/>

    <bean id="eventListenerIntegrator" class="com.company.product.persist.hibernate.EventListenerIntegrator"/>

    <bean id="hibernateSessionFactory" class="com.company.product.persist.hibernate.CustomHibernateSessionFactoryBean"
        depends-on="migrationVersionVerifier">
        <constructor-arg ref = "customInfinispanRegionFactory"/>
        <constructor-arg ref = "eventListenerIntegrator"/>
        <property name="hibernateProperties" ref="optionValueStoreProperties" />
        <property name="packagesToScan" value="com.company.product.entity" />
        <property name="dataSource" ref="dataSource" />
    </bean>
</beans>

Я включил журналы, чтобы увидеть, какой менеджер транзакций используется.

DEBUG [o.s.t.jta.JtaTransactionManager] JTA TransactionManager found at fallback JNDI location [java:/TransactionManager]
INFO  [o.s.t.jta.JtaTransactionManager] Using JTA UserTransaction: org.wildfly.transaction.client.LocalUserTransaction@701458cf
INFO  [o.s.t.jta.JtaTransactionManager] Using JTA TransactionManager: org.wildfly.transaction.client.ContextTransactionManager@2bba8287
DEBUG [o.s.t.jta.JtaTransactionManager] JTA TransactionSynchronizationRegistry found at default JNDI location [java:comp/TransactionSynchronizationRegistry]
INFO  [o.s.t.jta.JtaTransactionManager] Using JTA TransactionSynchronizationRegistry: org.jboss.as.txn.service.internal.tsr.TransactionSynchronizationRegistryWrapper@5437a6d1

session.getTransaction ().getStatus () равен NOT_ACTIVE session.getFlushMode () равен AUTO ***** Есть ли проблема с jtaTransactionManager ??****

...