我的班级Foo有方法:
protected void saveMany(Collection<T> many) {
for(Object one : many) {
one = session.merge(one); // also tried this commented out
session.saveOrUpdate(one); // session.merge(one);
}
尝试使用saveOrUpdate并合并,但两者都给了我这个例外:
Error: Invocation of method 'saveMany' in class Foo threw exception class org.hibernate.HibernateException : org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [Bar#581301]
如何解决此问题?
旁注:
当我截断我的表时,保存部分可以正常工作,但是当我填充表格并再次运行此方法,从而更新表格时,它会失败,并出现此异常
答案 0 :(得分:6)
如果你的Hibernate会话缓存中已存在@Id
类的分离实例,则必须调用merge()
将分离的实例合并到缓存中。然后你应该拨打saveOrUpdate()
。
但是你必须小心将实例返回从对merge()的调用中持久化,而不是作为参数传入的实例。所以你的代码必须看起来像这样
mergedOne = session.merge(one);
session.saveOrUpdate(mergedOne);
如果您在事务内部操作,则在会话结束且事务提交之前,或者您明确调用flush()
答案 1 :(得分:1)
它表示您正在尝试使用另一个已使用的ID保存新对象。
您可能没有正确实施equals
和hashCode
。所以,hibernate发现你想用id1保存Object2,而在数据库中有Object2的id1,但不是Object2.equals(Object1)
答案 2 :(得分:0)
您的Hibernatesessions缓存中有多个版本的“one”!
您必须找到“one”的实例,并使用“.evict(...)”从Hibernatesessions中删除缓存信息。
最后,您可以调用saveOrUpdate succesuflly!
答案 3 :(得分:0)
您可能正在尝试保存具有一个或多个等于对象的List<T>
。
使用SaveOrUpdate或合并来解决它,或者简单地尝试使所有对象都是唯一的。