Hibernate数据delete时容易忽略的问题
在主线程通过hibernate的find查询到数据后,把list里数据分别加入到新的list中,然后给子线程处理,子线程在执行getHibernateTemplate().delete(o)的时候,就可能会出现org.hibernate.StaleStateException。
我觉得这个异常出现的原因和内存回收有关系,在内存回收的时候。在session关闭的时候,这些数据会变成游离态,如果JAVA虚拟机没有进行垃圾回收的话,在执行delete操作时是没问题的。如果内存不够,或者有频繁的其他操作影响垃圾回收了,那在执行delete操作时就会出现这个问题。
另外,如果直接通过new一个object,生成主键之类的数据,直接delete数据,基本上也会出现这个问题。
解决的方法可以是:在每次的delete之前,先根据主键进行查询操作,如果不为null,再进行delete操作。
另外,直接通过sql进行delete操作应该也可以。update,save等操作应该也是同一个问题。
另外欢迎大家提其他的解决方案。 1 楼 jinnianshilongnian 4 小时前 我觉得这个异常出现的原因和内存回收有关系,在内存回收的时候。 跟垃圾回收无关,况且你拿着这个model的引用不可能回收。
StaleStateException异常描述:
public class StaleStateException
extends HibernateException
Thrown when a version number or timestamp check failed, indicating that the Session contained stale data (when using long transactions with versioning). Also occurs if we try delete or update a row that does not exist.
Note that this exception often indicates that the user failed to specify the correct unsaved-value strategy for a class!
能否贴出详细异常,需要看一下详细异常。