Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:防止更新会话中从未手动更新()的脏实例_Java_Hibernate_Spring_Jakarta Ee - Fatal编程技术网

Java Hibernate:防止更新会话中从未手动更新()的脏实例

Java Hibernate:防止更新会话中从未手动更新()的脏实例,java,hibernate,spring,jakarta-ee,Java,Hibernate,Spring,Jakarta Ee,我遇到了Hibernate的一个行为,我不知道这是一个特性还是在我的代码中错误地使用了Hibernate 会话的FlushMode设置为FlushMode.AUTO。如果执行select查询,hibernate autoflush过程将跳入并尝试更新实体,因为它认为它是脏的。然而,我并没有在会话中的某个地方调用这个实体的更新,我甚至认为我并没有修改它,甚至不是因为级联。 结果是,自动更新的脏实体导致我的数据库处于不需要的状态。我正在使用SaveUpdate实体侦听器跟踪该实体的此不需要的更新 我

我遇到了Hibernate的一个行为,我不知道这是一个特性还是在我的代码中错误地使用了Hibernate

会话的FlushMode设置为FlushMode.AUTO。如果执行select查询,hibernate autoflush过程将跳入并尝试更新实体,因为它认为它是脏的。然而,我并没有在会话中的某个地方调用这个实体的更新,我甚至认为我并没有修改它,甚至不是因为级联。 结果是,自动更新的脏实体导致我的数据库处于不需要的状态。我正在使用SaveUpdate实体侦听器跟踪该实体的此不需要的更新

我从stacktrace收集了所有这些信息,我给你们看了一段摘录,我的上述理论可能是错误的

2011-06-24 09:51:07,790 28671957 (SaveUpdateEventListener.java:140) FATAL  - Stacktrace from last unwanted update
java.lang.Exception
    at a.b.dao.listener.SaveUpdateEventListener.checkEntity(SaveUpdateEventListener.java:138)
    at a.b.dao.listener.SaveUpdateEventListener.onSaveOrUpdate(SaveUpdateEventListener.java:38)
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:535)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:527)
    at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:241)
    at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:292)
    at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:240)
    at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:193)
    at org.hibernate.engine.Cascade.cascade(Cascade.java:154)
    at org.hibernate.event.def.AbstractFlushingEventListener.cascadeOnFlush(AbstractFlushingEventListener.java:154)
    at org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:145)
    at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:88)
    at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:58)
    at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:997)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1142)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
    at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:921)
    at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:1)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
    at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:912)
    >> at a.b.dao.pricing.PricingDao.list(PricingDao.java:36) << THE SELECT STATEMENT
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
    at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:688)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621)
    ...

那么,自动更新脏字段是一项功能吗?如果是,它是由FlushMode.AUTO引起的,我是否能够使用FlushMode.MANUAL禁用此功能?

您必须对有问题的对象执行某些操作,使Hibernate将其视为脏对象。与其试图破坏正常的Hibernate行为,不如尝试在代码中查找Hibernate的错误/误用


另一方面,如果你绝对不需要Hibernate会话的智能来检测脏对象并发布插入、更新和删除,那么考虑使用Hibernate无状态会话。

你必须对那些使Hibernate感知它们为脏的对象做一些事情。与其试图破坏正常的Hibernate行为,不如尝试在代码中查找Hibernate的错误/误用


可选地,如果您不需要Hibernate会话的智能来检测脏对象并发布插入、更新和删除,那么考虑使用Hibernate无状态会话。< /P>有没有方法可以看出哪个属性被标记为脏?我已经查看了脏拦截器,但是我想我仍然需要知道Hibernate是如何比较属性的。您最好的选择是在一个非常有限的会话中重现这个问题,在Hibernate会话缓存中只有少数对象,并逐步完成代码。你可能想看看这篇文章:这可能是一个合适的选择。问题是,这是一个高负载的服务器环境,并且运行多个线程:/@Erik:如果您正在为这种部署进行开发,那么您不能不进行单元测试。如果可以在单元测试中重现此行为,则可以单步执行相同的Hibernate代码,而无需触摸生产服务器。启用Hibernate类别org.Hibernate=TRACE的日志记录,将准确显示哪些属性是脏的,这就是我检测它们的方式。是否有方法查看哪些属性准确标记为脏的?我已经查看了脏拦截器,但是我想我仍然需要知道Hibernate是如何比较属性的。您最好的选择是在一个非常有限的会话中重现这个问题,在Hibernate会话缓存中只有少数对象,并逐步完成代码。你可能想看看这篇文章:这可能是一个合适的选择。问题是,这是一个高负载的服务器环境,并且运行多个线程:/@Erik:如果您正在为这种部署进行开发,那么您不能不进行单元测试。如果可以在单元测试中重现此行为,则可以单步执行相同的Hibernate代码,而无需触摸生产服务器。启用Hibernate类别org.Hibernate=TRACE的日志记录,将准确显示哪些属性是脏的,这就是我检测它们的方式。