java - Hibernate 错误 : org. hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与 session 关联

标签 java hibernate orm

我有两个用户对象,当我尝试使用

保存对象时
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]

我正在使用

创建 session
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 对象,所以我知道为什么说该对象存在于 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/

相关文章:

database - openerp中的ORM搜索方法不区分大小写

java - 如何向 JSF 添加两个属性文件

java - 我必须将 Tomcat 连接池的 JDBC 驱动程序放在哪里?

java - C3p0 属性对 Spring/Hibernate 应用程序的影响?

android - Sugar ORM Android 多数据库

database - 更改数据库模型 - Sequelize

java - 如何使用 jackson 将具有 json 值的 Map<String, String> 转换为 POJO?

Java - 从 URL 的视频中获取片段

java - 如何检查电子邮件是否存在,除了请求的用户之外?

java - JPA继承要求子类中的ID