简体   繁体   中英

JPA 2.1, Hibernate 4.3, Spring 4.0 data not saving to database

I have an app that uses spring 4.0,JPA 2.1, Hibernate 4.3.5, Glassfish 4.0 and JTA transaction manager.
After I updated JPA from 2.0 to 2.1 and from Hibernate 4.2.x to 4.3 the data is not saved into database anymore although the logs seems ok.
So these are may config files : entityManager

<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>

my transaction manager:

<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"/>

All my DAO classes inheit this class:

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();
    }
}

THis is my service class:

@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();

}
}

After I hit the updateApplication method the logs are correct, everything seems to works fine, but the update is not persisted to database. At first this seems like the transaction does not or the transaction is not created, but here are the logs :

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 [org.springframework.orm.jpa.EntityManagerHolder@48ff5d9c] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@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 [org.springframework.orm.jpa.EntityManagerHolder@48ff5d9c] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@e9c2514] bound to thread [http-listener-1(3)]
(TransactionSynchronizationManager.java:140) - Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@48ff5d9c] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@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 [org.springframework.orm.jpa.EntityManagerHolder@48ff5d9c] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@e9c2514] bound to thread [http-listener-1(3)]
(TransactionSynchronizationManager.java:140) - Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@48ff5d9c] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@e9c2514] bound to thread [http-listener-1(3)]
(TransactionSynchronizationManager.java:140) - Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@48ff5d9c] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@e9c2514] bound to thread [http-listener-1(3)]
(TransactionSynchronizationManager.java:140) - Retrieved value [org.springframework.orm.jpa.EntityManagerHolder@48ff5d9c] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@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 [org.springframework.orm.jpa.EntityManagerHolder@48ff5d9c] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@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

If I enable sql_log I cannot see the update statements being performed.... I suspect something between JPA 2.1 any my entityManager, transaction manager but I cannot figure what it is...
Any idea about that ?

The solution that i applied was to unde the persistence.xml file and to add there the property:

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

as found on : https://coderwall.com/p/e5fxrw
Also I have removed packagesToScan from my EntityManager definition.

I had the same problem after updating Hibernate from 4.2.x to 4.3.x.

Setting the "hibernate.transaction.flush_before_completion" property to true solved the issue for me.

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

https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/
"If enabled, the session will be automatically flushed during the before completion phase of the transaction. Built-in and automatic session context management is preferred, see Section 2.5, “Contextual sessions”".

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM