我有两个用户对象,当我尝试使用
保存对象时session.save(userObj);
我收到以下错误:
Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
[com.pojo.rtrequests.User#com.pojo.rtrequests.User@d079b40b]
我正在使用
创建 sessionBaseHibernateDAO dao = new BaseHibernateDAO();
rtsession = dao.getSession(userData.getRegion(),
BaseHibernateDAO.RTREQUESTS_DATABASE_NAME);
rttrans = rtsession.beginTransaction();
rttrans.begin();
rtsession.save(userObj1);
rtsession.save(userObj2);
rtsession.flush();
rttrans.commit();
rtsession.close(); // in finally block
我还尝试在保存之前执行 session.clear()
,但仍然没有成功。
这是我第一次在用户请求到来时获取 session 对象,所以我知道为什么说该对象存在于 session 中。
有什么建议吗?
最佳答案
我已经多次遇到这个错误,而且很难追查...
基本上,hibernate 的意思是你有两个对象具有相同的标识符(相同的主键),但它们不是同一个对象。
我建议您分解代码,即注释掉一些位直到错误消失,然后将代码放回原处,直到它再次出现,您应该会找到错误。
这通常通过级联保存发生,其中对象 A 和 B 之间存在级联保存,但对象 B 已与 session 关联,但与 A 上的对象不在同一个 B 实例上。
您使用的是什么主键生成器?
我问的原因是这个错误与你如何告诉 hibernate 确定对象的持久状态(即对象是否持久)有关。该错误可能会发生,因为 hibernate 正在尝试持久化一个已经持久化的对象。事实上,如果你使用 save hibernate 会尝试并持久化该对象,并且可能已经有一个具有与 session 关联的相同主键的对象。
示例
假设您有一个基于主键组合(第 1 列和第 2 列)的包含 10 行的表的 hibernate 类对象。现在,您在某个时间点从表中删除了 5 行。现在,如果您尝试再次添加相同的 10 行,而 hibernate 尝试将对象持久保存在数据库中,则将添加已删除的 5 行而不会出错。现在剩下的 5 行已经存在,将抛出这个异常。
因此,简单的方法是检查您是否更新/删除了表中的任何值,该值是某事物的一部分,然后您是否尝试再次插入相同的对象
关于java - Hibernate 错误 : org. hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与 session 关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1074081/