使用hibernate保存/更新对象

时间:2012-08-13 13:11:57

标签: java hibernate generics

我的班级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 个答案:

答案 0 :(得分:6)

如果你的Hibernate会话缓存中已存在@Id类的分离实例,则必须调用merge()将分离的实例合并到缓存中。然后你应该拨打saveOrUpdate()

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

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

如果您在事务内部操作,则在会话结束且事务提交之前,或者您明确调用flush()

时,数据库将不会更新

答案 1 :(得分:1)

它表示您正在尝试使用另一个已使用的ID保存新对象。

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

答案 2 :(得分:0)

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

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

  

最后,您可以调用saveOrUpdate succesuflly!

答案 3 :(得分:0)

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

使用SaveOrUpdate或合并来解决它,或者简单地尝试使所有对象都是唯一的。

相关问题