Java 使用hibernate保存/更新对象

Java 使用hibernate保存/更新对象,java,hibernate,generics,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); } 如何解决此

我的类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);   
        }
如何解决此问题?

旁注:


当我截断我的表时,保存部分起作用,但当我填充表并再次运行此方法,从而更新表时,它会失败,出现此异常

它表示您正试图保存一个新对象,该对象的Id已被另一个对象使用


可能您没有正确实现
equals
hashCode
。因此,hibernate发现您想要用id1保存Object2,并且在数据库中有id1的Object2,但不是
Object2。equals(Object1)
您的HibernateSession缓存中有多个版本的“one”

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

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


您可能正在尝试保存包含一个或多个equals对象的
列表


使用SaveOrUpdate或merge解决该问题,或简单地尝试使所有对象唯一

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

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

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

如果您在事务内部操作,则在会话结束并提交事务之前,或在调用
merge()
时显式调用
flush()

时,数据库不会被更新。您是否记得在从merge()返回的实例上调用
saveOrUpdate()
而不是作为参数传入merge()的实例?请看@Brad:不,我根本没有调用saveOrUpdate,我只是调用merge。你是说像这样的
session.saveOrUpdate(session.merge(one))
,它说:
赋值的左侧必须是一个变量
@Brad:I这样做:
one=session.merge(one);会话。保存或更新(一个)@invariant好的,我想我找到了发生这种情况的地方,但是如何从hibernate上下文中获取对象的第一个实例呢?不,我没有列表,我有对象
t
。我试着使用合并和saveOrUpdate,正如在第一篇文章中看到的。您正在传递集合,列表扩展了集合,所以您的集合有重复项。尝试删除这些重复项。可能是因为我的实际方法有两个集合作为参数,例如:
saveMany(集合更新,集合删除)
。我从初始代码中删除了一个,以简化操作。可能吧,但这正是我想做的:当数据库中有具有相同主键的对象时,只需覆盖字段。但您的对象是否实现了equals()?在一门关于JPA(好的,不是Hibernate)的课程中,我被告知你必须正确地实现equals,它才能工作。不,它不能,你能给我一个关于你的意思的链接吗?我没有平等的地方;哇,这真是让人困惑,我真的不明白,为什么我必须在获得主键时创建另一个标识符。我想我正在这样做,但我关闭了上一个会话。关闭!=驱逐“一”和非公开会议之间的参考仍然给出!System.out.println(one.getClass())是什么?
mergedOne = session.merge(one);
session.saveOrUpdate(mergedOne);