gpt4 book ai didi

java - Hibernate:防止更新 session 中从未手动更新的脏实例

转载 作者:行者123 更新时间:2023-12-01 19:16:27 24 4
gpt4 key购买 nike

我遇到了 Hibernate 的一种行为,我不知道它是我的代码中 Hibernate 的功能还是错误/错误使用。

我的 session 的 FlushMode 设置为 FlushMode.AUTO。如果我执行选择查询, hibernate 自动刷新过程就会跳入并尝试更新实体,因为它认为实体很脏。但是,我没有在 session 中的某个地方调用此实体的 update() ,我什至认为我没有修改它,甚至不是由于级联。结果是自动更新的脏实体导致我的数据库处于不需要的状态。我正在使用 SaveUpdate 实体监听器跟踪实体的这种不需要的更新。

我正在从堆栈跟踪中收集所有这些信息(我向您展示摘录,我的上述理论可能是错误的;))

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 session 的智能来检测脏对象并基于此发出插入、更新和删除,请考虑使用 Hibernate 无状态 session 。

关于java - Hibernate:防止更新 session 中从未手动更新的脏实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6465959/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com