如何使用Hibernate会话提交非会话对象

14 浏览
0 Comments

如何使用Hibernate会话提交非会话对象

我正在使用Hibernate和Struts 1开发一个网页应用。我的应用程序运行在一台机器上,而我的Hibernate代码运行在另一台机器上。我使用web服务来访问数据库。我的问题是,当我尝试更新任何对象时,当我通过我的服务方法调用commit时,它会抛出\"org.hibernate.NonUniqueObjectException\"异常。\n造成这个问题的原因是,当我检索要编辑的对象时,它会被附加到Hibernate会话中,然后当我尝试更新时,它会在服务端创建一个新的对象,因为我对对象进行了反序列化,所以可能会有两个具有相同标识符的对象。\n有没有人能够对这个问题有一些见解?

0
0 Comments

在使用Hibernate session时,如果要提交非会话对象(non-session objects),需要先将这些分离对象(detached objects)合并(merge)到Hibernate Session中,然后再进行提交。如果使用HibernateUtil类,代码如下所示:

final Session session = HibernateUtil.getInstance().getSessionFactory().getCurrentSession();
// ...
session.merge(entity);

在这里查看更多信息:here

出现这个问题的原因是,Hibernate session是用来管理和跟踪对象状态的。当一个对象从session中分离出来后,它的状态将变为分离状态(detached),不再受session的管理。因此,如果要提交这些分离对象,就需要先将它们合并到session中,使其重新成为受session管理的对象。

解决方法是使用merge()方法将分离对象合并到session中。merge()方法会返回一个持久化对象,该对象在session中被管理。然后,可以使用session的其他方法来操作和提交这些对象。

总结起来,解决这个问题的方法是使用merge()方法将分离对象合并到Hibernate session中,然后再进行提交。这样可以确保非会话对象按照预期被保存和管理。

0