简体   繁体   English

JPA 2.1,Hibernate 4.3,Spring 4.0数据未保存到数据库

[英]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. 我有一个使用spring 4.0,JPA 2.1,Hibernate 4.3.5,Glassfish 4.0和JTA事务管理器的应用程序。
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. 我将JPA从2.0更新到2.1,从Hibernate 4.2.x更新到4.3后,尽管日志看起来还可以,但数据不再保存到数据库中。
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: 我所有的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();
    }
}

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. 在我单击updateApplication方法后,日志是正确的,似乎一切正常,但是更新未持久到数据库。 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... 如果启用sql_log,则看不到正在执行的更新语句。...我怀疑JPA 2.1与我的任何entityManager,事务管理器之间都存在某些问题,但我无法弄清它是什么...
Any idea about that ? 有什么想法吗?

The solution that i applied was to unde the persistence.xml file and to add there the property: 我应用的解决方案是取消persistence.xml文件并在其中添加属性:

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

as found on : https://coderwall.com/p/e5fxrw 如在: https : //coderwall.com/p/e5fxrw
Also I have removed packagesToScan from my EntityManager definition. 另外,我还从EntityManager定义中删除了packagesToScan。

I had the same problem after updating Hibernate from 4.2.x to 4.3.x. 将Hibernate从4.2.x更新到4.3.x之后,我遇到了同样的问题。

Setting the "hibernate.transaction.flush_before_completion" property to true solved the issue for me. 将“ 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/ https://docs.jboss.org/hibernate/orm/4.3/manual/zh-CN/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”". “如果启用,则在事务的完成阶段之前将自动刷新会话。首选内置和自动会话上下文管理,请参见第2.5节“上下文会话”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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