sh NonUniqueObjectException
话题引入:
使用hibernate进行更新操作时,首先调用了findById方法获取要修改的对象,此时session没有被关闭,接着重新创建一个对象,将要修改的属性值赋值给这个对象。调用修改方法抛出如下异常:
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session
原因:
在session缓存中已经存在一个与当前传递进来的修改对象具有相同标识符(主键)的对象。Hibernate的机制是只能存在一个具有唯一标示的对象,否则增删改就会出错。
解决办法:
1)在使用过滤器/拦截器时,每次开启session,操作后就关闭session。
2)session.evict(Object object),从缓存中清除指定的对象。
3)session.clear(),是将session缓存中的对象全部清除,杀伤面太大了,不建议使用。