3

我的班级 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]

如何解决这个问题?

边注:

当我截断我的表时,保存部分可以工作,但是当我填充了表并再次运行此方法时,因此更新了表,它失败了,但有这个例外

4

4 回答 4

6

如果你有一个@Id已经存在于 Hibernate Session 缓存中的 Class 的分离实例,那么你将不得不调用merge()将分离的实例合并到缓存中。那么你应该打电话给saveOrUpdate().

但是您必须小心保留从调用 merge()返回的实例,而不是作为参数传入的实例。所以你的代码必须看起来像这样

mergedOne = session.merge(one);
session.saveOrUpdate(mergedOne);

如果您在事务内部进行操作,则数据库将在会话结束并且事务提交之前不会更新,或者您显式调用flush()

于 2012-08-13T14:51:02.967 回答
1

它表示您正在尝试保存一个新对象,其 Id 已被另一个对象使用。

可能,您没有正确实施equalshashCode. 所以,hibernate发现你想用id1保存Object2,而数据库里有id1的Object2,但是没有Object2.equals(Object1)

于 2012-08-13T13:18:19.127 回答
0

您的 Hibernatesessions 缓存中有多个版本的“one”!

您必须找到“one”的实例并使用“.evict(...)”从 Hibernatesessions 中删除缓存信息。

最后,您可以成功调用 saveOrUpdate!

于 2012-08-13T13:20:03.110 回答
0

您可能正在尝试保存List<T>具有一个或多个 equals 对象的保存。

使用 SaveOrUpdate 或 merge 来解决它,或者简单地尝试使所有对象都独一无二。

于 2012-08-13T13:21:44.207 回答