Could not invoke method '***' on target object [com.****@5b787144]: nested exception is net.sf.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 2203, of class: com.*]
以上是在公司发现job运行某天没有出现数据的异常情况:
net.sf.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: 2203
这句话已经表明 数据库里 从 主键ID 为2203 开始,就已经存在不同的value值对应同一个ID 。经过查找发现,是由于之前手动插入id为2203的数据(oracle数据可自动生成id并插入,这是引发问题的关键),根据主键class为sequence生成策略,id之每次增加1,从而导致了这次数据update的错误,希望各位引以为戒,注意数据更新的方式方法。
引问:
1、生成策略为increment 或者 不指明id值时,是否可以避免此问题?
2、生成策略为sequence时,实现自增1,那基础数值是如何获取的?
欢迎大家对此讨论留言,谢谢。
参考如下转载的案例:
NonUniqueObjectException问题的解决
在公司做模块的时候遇到了NonUniqueObjectException 错误,
1. adifferentobjectwiththesameidentifiervaluewasalreadyassociatedwiththesession:
2.[com.......#1462109];
3. nestedexceptionisorg.hibernate.NonUniqueObjectException:
4. adifferentobjectwiththesameidentifiervaluewasalreadyassociatedwiththesession:
5.[com. .....#1462109]
6.
看错误的原因是因为针对一个对象加载了引用,由于有多个引用指向一个对象,在你去update的时候,出现了对象不同步问题,hibernate不知道要保存哪个对象,查了下原因,原来是我所做的hibernate映射在主表中对子表做映射的时候设置了lazy="false",这样主表在查取数据的时候就会相应的也把子表的数据取出来,然后在子表的编辑页面做update操作的时候就又加载了一个引用,现在去更新它的时候,hibernate就不知道更新哪个了。
解决办法,将lazy="true" 或者默认不设置即可。