2015-06-18 2 views
1

Я проникаю приложение изПружина 4 + JPA (спящий режим 4) + менеджер транзакций ЕТА не смывать автоматически

Spring 3.0.5 + JPA 2.0 к Пружина 4 + JPA (Hibernate 4)

Я выполнил руководство по миграции: https://github.com/spring-projects/spring-framework/wiki/Migrating-from-earlier-versions-of-the-spring-framework.

Приложение использует диспетчер транзакций JTA: Jencks/GeronimoPlatformTransactionManager (из-за транзакций, распределенных по источникам данных и ESB).

Конфигурация Пружина/JPA является:

<bean id="rduEntityManagerFactory" class="ch.vd.dsas.rdu.repository.crud.service.ExtendedLocalContainerEntityManagerFactoryBean" 
    depends-on="rduTransactionManagerLocator,jGroupsCacheManagerPeerProviderFactoryLocator"> 
    <property name="persistenceUnitName" value="rduPersistenceUnit" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="databasePlatform" value="${rdu.jpa.database}" /> 
     </bean> 
    </property> 
    <property name="persistenceUnitPostProcessors"> 
     <bean class="ch.vd.dsas.rdu.commons.tx.spring.JtaPersistenceUnitPostProcessor"> 
      <property name="jtaDataSource" ref="rduDataSource" /> 
     </bean> 
    </property> 
    <property name="jpaProperties" ref="jpaProperties"/> 
</bean> 

<util:properties id="jpaProperties"> 
    <prop key="javax.persistence.transactionType">JTA</prop> 
    <prop key="javax.persistence.validation.mode">CALLBACK</prop> 
    <prop key="hibernate.hbm2ddl.auto">${rdu.jpa.hbm2ddl.auto}</prop> 
    <prop key="hibernate.current_session_context_class">jta</prop> 
    <!-- Transaction properties --> 
    <prop key="hibernate.transaction.jta.platform">ch.vd.dsas.rdu.ref.transaction.jencks.JencksTransactionManagerLookup</prop> 
    <prop key="hibernate.transaction.manager_lookup_class">ch.vd.dsas.rdu.transaction.jencks.JencksTransactionManagerLookup</prop> 
    <prop key="hibernate.default_schema">${rdu.datasource.schemaMetier}</prop> 
    <!-- Debug properties --> 
    <prop key="hibernate.format_sql">true</prop> 
    <prop key="hibernate.show_sql">true</prop> 
    <!-- Cache properties --> 
    <prop key="hibernate.cache.use_second_level_cache">true</prop> 
    <prop key="hibernate.cache.use_query_cache">true</prop> 
    <prop key="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.ReplicatedSingletonEhCacheRegionFactory</prop> 
    <prop key="hibernate.cache.cluster_name">${rdu.hibernate.cache.jgroups.cluster.name}</prop> 
    <prop key="net.sf.ehcache.configurationResourceName">/hibernate-ehcache.xml</prop> 
</util:properties> 

Сделки аннотаций привода:

менеджера
<tx:annotation-driven transaction-manager="rduJtaTransactionManager" /> 

Сделки объявляются так:

<!-- From Jencks org.jencks:jencks:2.2 --> 
<bean id="rduJencksTransactionManager" class="org.jencks.factory.TransactionManagerFactoryBean" /> 

<bean id="rduJtaTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <qualifier value="rdu" /> 
    <property name="transactionManager" ref="rduJencksTransactionManager" /> 
    <property name="userTransaction" ref="rduJencksTransactionManager" /> 
</bean> 

<bean id="rduTransactionManagerLocator" class="ch.vd.dsas.rdu.transaction.jencks.TransactionManagerLocator" factory-method="getInstance"> 
    <property name="transactionManager" ref="rduJencksTransactionManager"/> 
</bean> 

Приложения запуска и доступ к данным и их отображение.

Однако вставка/обновление не производится.

Если я изменю данные и отправлю изменение, приложение получит изменение, но данные не будут сброшены в базу данных.

Я активировал журналы и я вижу сделку:

RDU 2015-06-18 20: 28: 01817 [HTTP-8080-1] DEBUG [ostjJtaTransactionManager] Создание новой транзакции с именем [орг .springframework.data.jpa.repository.support.SimpleJpaRepository.save]: PROPAGATION_REQUIRED, ISOLATION_DEFAULT; 'rdu' rdu 2015-06-18 20: 28: 01,817 [http-8080-1] DEBUG [ostjJtaTransactionManager] Участие в существующих транзакциях rdu 2015-06-18 20: 28: 01,823 [http-8080-1] DEBUG [ostjJtaTransactionManager] Инициирование транзакции фиксации

Но ничего не отправляется в базу данных.

Если я перехватываю выполнение посредством отладки и вручную очищает сеанс Hibernate, данные обновляются.

Кажется, сессия JPA/Hibernate не согласована с транзакцией.

Я не могу понять, что отсутствует в конфигурации и почему сеанс не сбрасывается автоматически.

Надеюсь, вы сможете помочь мне в этом вопросе.

С наилучшими пожеланиями, Эрик

+0

Надеюсь, это поможет http://forum.spring.io/forum/spring-projects/data/117081-session-not-flushed-with-hibernate -4-1-3-jta-and-spring-transaction-management-integ – Amogh

+0

Спасибо Amogh :-). Я собираюсь попробовать одно из этих решений. Мне интересно, не следует ли мне переключать диспетчер транзакций на Bitronix следующим образом [link] (https://github.com/edwinkun/xadatasource-demo/blob/master/src/main/webapp/WEB-INF/applicationContext- datasource.xml). –

ответ

0

Проблема связана с этим свойством:

<prop key="hibernate.transaction.jta.platform">ch.vd.dsas.rdu.ref.transaction.jencks.JencksTransactionManagerLookup</prop> 

Свойство hibernate.transaction.jta.platform не то же самое с hibernate.transaction.manager_lookup_class и она должна указывать на AbstractJtaPlatform реализации:

<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/> 
+0

Вы правы, я обнаружил то же самое сегодня утром. Имя пакета неверно. После его исправления приложение очищает изменения базы данных :-)! –

Смежные вопросы