2014-04-11 5 views
1

스프링 4.0, JPA 2.1, Hibernate 4.3.5, Glassfish 4.0 및 JTA 트랜잭션 관리자를 사용하는 애플리케이션이있다.
JPA를 2.0에서 2.1로, 그리고 Hibernate 4.2.x에서 4.3으로 업데이트 한 후에 로그가 괜찮은 것처럼 보이더라도 데이터는 더 이상 데이터베이스에 저장되지 않습니다. 위해 entityManager JPA 2.1, Hibernate 4.3, Spring 4.0 데이터가 데이터베이스에 저장되지 않음

내 트랜잭션 관리자

<bean id="emfCC" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
<property name="dataSource" ref="CCDS" /> 
<property name="packagesToScan" value="com.videanuadrian.core.entity" /> 
<property name="jpaVendorAdapter"> 
    <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" />    
    </bean> 
</property> 

<property name="jpaProperties"> 
    <props>    
     <prop key="hibernate.connection.autocommit">false </prop> 
     <prop key="hibernate.show_sql">false</prop> 
     <prop key="hibernate.format_sql">false</prop> 
     <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop> 
     <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.SunONETransactionManagerLookup</prop> 
     <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>     
     <prop key="hibernate.cache.use_query_cache">true</prop> 
     <prop key="hibernate.cache.use_second_level_cache">true</prop> 
     <prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</prop> 
     <prop key="hibernate.cache.provider_class">org.hibernate.cache.ehcache.EhCacheProvider</prop> 
     <prop key="hibernate.generate_statistics">false</prop> 
    </props> 
    </property> 
:이 클래스 inheit

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> 
    <property name="transactionManagerName" value="java:appserver/TransactionManager"/> 
</bean> 

<tx:advice id="txAdvice" transaction-manager="transactionManager"> 
    <tx:attributes >   
     <tx:method name="get*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="true"/>   
     <tx:method name="is*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="true"/> 
     <tx:method name="*" rollback-for="java.lang.Exception" propagation="REQUIRED" read-only="false"/> 
    </tx:attributes>  
</tx:advice> 

<aop:aspectj-autoproxy/> 
<aop:config> 
    <aop:pointcut id="cs" expression="execution(* com.videanuadrian.contactcenter.services..*.*(..))"/> 
    <aop:advisor advice-ref="txAdvice" pointcut-ref="cs" /> 
</aop:config> 

<aop:config> 
    <aop:pointcut id="pcCore" expression="execution(* com.videanuadrian.core.impl.services..*.*(..))"/> 
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pcCore"/> 
</aop:config> 
<jee:jndi-lookup id="CCDS" jndi-name="jdbc/contactCenter"/> 

내 모든 DAO 클래스 :

public abstract class GenericDAOImpl<T> implements GenericDAO<T> { 

    @PersistenceContext(type = PersistenceContextType.TRANSACTION,synchronization=SynchronizationType.SYNCHRONIZED) 
    protected EntityManager em; 

    private Class<T> type; 

    protected static final Logger logger = Logger.getLogger(GenericDAOImpl.class); 

    public GenericDAOImpl() { 
     Type t = getClass().getGenericSuperclass(); 
     ParameterizedType pt = (ParameterizedType) t; 
     type = (Class) pt.getActualTypeArguments()[0]; 
    } 

    public EntityManager getEm() { 
     return em; 
    } 

    public void setEm(EntityManager em) { 
     this.em = em; 
    } 

    @Override 
    public T create(final T t) { 
     this.em.persist(t); 
     return t; 
    } 

    @Override 
    public void delete(final Object id) { 
     this.em.remove(this.em.getReference(type, id)); 
    } 

    @Override 
    public T find(final Object id) { 
     return (T) this.em.find(type, id); 
    } 

    @Override 
    public T update(final T t) { 
     return this.em.merge(t);    
    } 

    @Override 
    public void flush(){ 
     this.em.flush(); 
    } 
} 

이이
그래서이 파일을 config (설정) 할 수 있습니다 내 서비스 클래스 :

@Named 
public class ApplicationServiceImpl implements ApplicationService { 

@Inject 
private ApplicationDAO applicationDAO; 


@Override 
public Long updateApplication(Application app) { 

    if (app == null) 
     return null; 

    applicationDAO.update(app); 

    return app.getId(); 

} 
} 

updateApplication 메소드를 실행 한 후에는 로그가 올바르지 만 모든 것이 올바르게 작동하지만 업데이트가 데이터베이스에 유지되지 않습니다. 내가 SQL_LOG을 사용하는 경우

AbstractPlatformTransactionManager.java:367) - Creating new transaction with name [com.videanuadrian.core.impl.services.ApplicationServiceImpl.updateApplication]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT,-java.lang.Exception 
(TransactionSynchronizationManager.java:272) - Initializing transaction synchronization 
(TransactionAspectSupport.java:447) - Getting transaction for [com.videanuadrian.core.impl.services.ApplicationServiceImpl.updateApplication] 
(EntityManagerFactoryUtils.java:272) - Opening JPA EntityManager 
(EntityManagerFactoryUtils.java:290) - Registering transaction synchronization for JPA EntityManager 
(TransactionSynchronizationManager.java:193) - Bound value [[email protected]] for key [org[email protected]e9c2514] to thread [http-listener-1(3)] 
(AbstractBeanFactory.java:249) - Returning cached instance of singleton bean 'auditLogAspectImpl' 
(AbstractPlatformTransactionManager.java:472) - Participating in existing transaction 
(TransactionAspectSupport.java:447) - Getting transaction for [com.videanuadrian.core.impl.services.UserServiceImpl.getUser] 
(TransactionSynchronizationManager.java:140) - Retrieved value [[email protected]] for key [org[email protected]e9c2514] bound to thread [http-listener-1(3)] 
(TransactionSynchronizationManager.java:140) - Retrieved value [[email protected]] for key [org[email protected]e9c2514] bound to thread [http-listener-1(3)] 
(TransactionAspectSupport.java:476) - Completing transaction for [com.videanuadrian.core.impl.services.UserServiceImpl.getUser] 
(AbstractPlatformTransactionManager.java:472) - Participating in existing transaction 
(TransactionAspectSupport.java:447) - Getting transaction for [com.videanuadrian.core.impl.services.AuditLogServiceImpl.addAuditLogEvent] 
(TransactionSynchronizationManager.java:140) - Retrieved value [[email protected]] for key [org[email protected]e9c2514] bound to thread [http-listener-1(3)] 
(TransactionSynchronizationManager.java:140) - Retrieved value [[email protected]] for key [org[email protected]e9c2514] bound to thread [http-listener-1(3)] 
(TransactionSynchronizationManager.java:140) - Retrieved value [[email protected]] for key [org[email protected]e9c2514] bound to thread [http-listener-1(3)] 
(TransactionSynchronizationManager.java:140) - Retrieved value [[email protected]] for key [org[email protected]e9c2514] bound to thread [http-listener-1(3)] 
(TransactionAspectSupport.java:476) - Completing transaction for [com.videanuadrian.core.impl.services.AuditLogServiceImpl.addAuditLogEvent] 
(TransactionAspectSupport.java:476) - Completing transaction for [com.videanuadrian.core.impl.services.ApplicationServiceImpl.updateApplication] 
(AbstractPlatformTransactionManager.java:926) - Triggering beforeCommit synchronization 
(AbstractPlatformTransactionManager.java:939) - Triggering beforeCompletion synchronization 
(TransactionSynchronizationManager.java:243) - Removed value [[email protected]] for key [org[email protected]e9c2514] from thread [http-listener-1(3)] 
(EntityManagerFactoryUtils.java:435) - Closing JPA EntityManager 
(AbstractPlatformTransactionManager.java:755) - Initiating transaction commit 
(AbstractPlatformTransactionManager.java:952) - Triggering afterCommit synchronization 
(AbstractPlatformTransactionManager.java:968) - Triggering afterCompletion synchronization 
(TransactionSynchronizationManager.java:331) - Clearing transaction synchronization 
(RequestLoggingPhaseListener.java:42) - Entering JSF Phase: RESTORE_VIEW 1 
(RequestLoggingPhaseListener.java:42) - Entering JSF Phase: RENDER_RESPONSE 6 

내가 볼 수없는 UPDATE 문이 수행되고 난 사이에 뭔가 의심 .... : 트랜잭션이되지 않거나 트랜잭션이 생성되지 않지만, 여기에 로그처럼 처음에는이 보인다 JPA 2.1 내 모든 entityManager, 트랜잭션 관리자가 있지만 그게 무엇인지 알 수는 없습니다 ...
그것에 대해 알고 싶으십니까?

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

에 발견 : 또한 내 EntityManager의 정의에서 packagesToScan을 제거한 https://coderwall.com/p/e5fxrw
제가 적용

+0

안녕하세요, Andei 님, 이미 시도했지만 예외는 진행중인 트랜잭션이 없습니다. 또한 updateApplication()에 대한 전파 수준에서 필수 항목을 넣으면 동일한 예외가 발생합니다. 그러나 로그에이 줄이있을 수는 있습니다. AbstractPlatformTransactionManager.java : 367) - 이름이 [com.videanuadrian. core.impl.services.ApplicationServiceImpl.updateApplication] : PROPAGATION_REQUIRES_NEW, ISOLATION_DEFAULT, -java.lang.Exception –

+0

packagesToScan을 넣고 persitence.xml의 모든 속성을 entityManager Bean으로 이동할 경우 읽어야하므로 persitence.xml 파일이 없습니다. 그것없이 "살아". 나는 jpa2.0을 사용하고 4.2 절기에서 persitence.xml 파일을 가지고 있다고 말해야한다. –

+0

트랜잭션 구분이 AOP로 이루어지기 때문에 @Transactional을 사용하지 않았습니다.따라서 패키지의 모든 메소드에 대해 : 트랜잭션이 열려 있어야합니다. 그리고 이상한 것은 로그에 트랜잭션이 열려있는 것 같지만 .... –

답변

0

이 솔루션은 persistence.xml 파일을 운데하고 거기에 속성을 추가하는 것이 었습니다.

0

최대 절전 모드를 4.2.x에서 4.3.x로 업데이트 한 후 동일한 문제가 발생했습니다.

"hibernate.transaction.flush_before_completion"속성을 true로 설정하면 문제가 해결되었습니다.

<prop key="hibernate.transaction.flush_before_completion">true</prop> 

https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/
"가 활성화되면, 세션은 자동으로 트랜잭션의 완료 이전 단계에서 플러시됩니다. 내장 및 자동 세션 컨텍스트 관리가 선호되는데, 2.5 절 참조"콘텐츠 세션 "".

관련 문제