我有两个用户对象,而在尝试使用以下方法保存对象时
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]
我正在使用创建会话
BaseHibernateDAO 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.clear()
这是我第一次在用户请求到来时获取会话对象,因此我要为什么要说该对象存在于会话中。
有什么建议么?
我有很多次此错误,很难追踪…
基本上,hibernate是指你有两个对象具有相同的标识符(相同的主键),但它们不是同一对象。
我建议你分解代码,即注释掉位,直到错误消失,然后再放回代码,直到返回为止,你应该找到错误。
它通常是通过级联保存发生的,其中对象A和B之间有级联保存,但是对象B已经与会话相关联,但不在同一B实例上。
你正在使用哪个主键生成器?
我问这个错误的原因与你如何告诉hibernate状态确定对象的持久状态(即对象是否持久)有关。可能发生此错误,因为hibernate正在尝试持久化并且已经持久化的对象。实际上,如果你使用保存,hibernate将尝试并保留该对象,并且可能已经有一个对象具有与该会话关联的相同主键。
例
假设你有一个基于主键组合的具有10行的表的hibernate类对象(第1列和第2列)。现在,你已在某个时间从表中删除了5行。现在,如果你尝试再次添加相同的10行,而hibernate尝试将对象持久化到数据库中,则将添加5条已经删除的行而不会出现错误。现在剩下的5行已经存在,将抛出此异常。
因此,简单的方法是检查你是否已更新/删除了表中属于某个内容的任何值,后来又尝试再次插入相同的对象