当前位置: 首页 > 面试题库 >

Hibernate错误:org.hibernate.NonUniqueObjectException:具有相同标识符值的另一个对象已与会话关联

巢宏富
2023-03-14
问题内容

我有两个用户对象,而在尝试使用以下方法保存对象时

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()在保存之前进行操作,但仍然没有运气。

这是我第一次在用户请求到来时获取会话对象,因此我要为什么要说该对象存在于会话中。

有什么建议么?


问题答案:

我已经多次发生此错误,很难追踪…

基本上,hibernate是指您有两个具有相同标识符(相同主键)但不是相同对象的对象。

我建议您分解代码,即注释掉位,直到错误消失,然后再放回代码,直到返回为止,您应该找到错误。

它通常是通过级联保存发生的,对象A和对象B之间有一个级联保存,但是对象B已经与该会话相关联,但是与对象A不在同一个实例B上。

您正在使用哪个主键生成器?

我问这个错误的原因与您如何告诉hibernate状态确定对象的持久状态(即对象是否持久)有关。该错误可能是由于hibernate试图持久化一个已经持久的对象而发生的。实际上,如果您使用保存,hibernate将尝试并持久化该对象,并且可能已经有一个对象具有与该会话关联的相同主键。

假设您有一个基于主键组合(表1和列2)的具有10行的表的hibernate类对象。现在,您已在某个时间从表中删除了5行。现在,如果您尝试再次添加相同的10行,而hibernate尝试将对象持久化到数据库中,则将添加5条已经删除的行而不会出现错误。现在,剩下的5行已经存在,将引发此异常。

因此,简单的方法是检查您是否已更新/删除了表中属于任何内容的任何值,以后又尝试再次插入相同的对象



 类似资料:
  • 问题内容: 在使用Spring和Hibernate的应用程序中,我解析CSV文件,并在每次从CSV文件中读取记录时通过调用来填充db 。 我的域模型: “家庭”有很多“子家庭” “子家庭”有很多“位置” “ Locus”属于“ Species” 都是双向映射。 码: 使用以下方法将物种分配给场所,该方法仅访问DAO层: Hibernate给出以下错误: 有小费吗? 问题答案: 使用。该异常表示当前

  • 问题内容: 我基本上在此配置中有一些对象(实际数据模型要复杂一些): A与B有多对多关系。(B具有) B与C具有多对一关系(我已设置为) C是一种类型/类别表。 另外,我可能应该提到主键是在保存时由数据库生成的。 使用我的数据,有时我会遇到一个问题,其中A具有一组不同的B对象,而这些B对象引用了相同的C对象。 打电话时,我收到了一个hibernate错误消息:。我知道hibernate无法在同一会

  • null 对于我的数据,我有时会遇到这样的问题:A有一组不同的B对象,而这些B对象引用同一个C对象。 当我调用时,我会得到一个hibernate错误:。我知道hibernate不能在同一个会话中插入/更新/删除同一个对象两次,但是有什么方法可以解决这个问题吗?这似乎并不是一种罕见的情况。 在我研究这个问题的过程中,我看到有人建议使用,但当我这样做时,任何“冲突”对象都会作为所有值都设置为null的

  • 此方法以事务开头 这是一个映射器类,我在其中创建DB帐户实体并映射地址和联系人。 当我不在地图内调用下面的方法时,一切都正常工作。但是当我调用它时,我得到了标题中描述的错误。 最后的方法是 异常堆栈跟踪 null

  • 我有以下问题: 有人对此有解释吗?我考虑从我的业务服务中的hibernate会话中重新加载对象,并从Struts HTTP会话中复制实体对象中的数据。 Hibernate映射

  • 问题内容: 我有一个小问题,我不知道该如何解决。请问你能帮帮我吗?当我尝试保留实体时,出现下一个异常: 我使用接缝2.3,进入休眠状态。我的import.sql文件中有一个插入语句: 它在表Schedule中插入一个实体。 然后,我使用EntityHome创建新的Schedule实体投放网页 和超类 当我尝试坚持下去时,我得到了这个例外。和网页上的消息 使用消息保存错误:具有相同标识符值的另一个对