gpt4 book ai didi

java - Hibernate 和 NonUniqueObjectException

转载 作者:搜寻专家 更新时间:2023-10-31 08:14:18 25 4
gpt4 key购买 nike

我有一个实体,其中包含另外两个具有@ManyToOne 关系的实体。

@Entity
public class A extends Serializable{

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;

@ManyToOne
@Cascade(CascadeType.SAVE_UPDATE)
private B b;

@ManyToOne
@Cascade(CascadeType.SAVE_UPDATE)
private C c;

}

如果我尝试保存一个具有另一个 A 记录的“B_ID”和“C_ID”的 A 实例,我会得到异常:

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

例如:

A table
| ID | B_ID | C_ID |
| 1 | 1 | null | // this works
| 2 | null | 1 | // this works
| 3 | 1 | x | // this throws the exception
| 4 | x | 1 | // this throws the exception

x=any value of existent B/C_ID

B_ID 和 C_ID 在我的模型中不是唯一的,并且 (B_ID + C_ID) 不是唯一约束!!

我能做什么?

提前致谢。

最佳答案

Hibernate 在这里并不是提示数据库的唯一性,而是提示当前 Session 已经包含一个与您要保存的新对象具有相同 ID 的对象。它不允许这样做——Hibernate 有一个严格的要求,即给定的 ID 不能由单个 session 范围内的两个不同对象表示。

在某些时候,您的应用程序已经保存或加载了具有相同 ID 的实体,并且该对象已经“注册”到 session 中。在这个特定的案例中很难说出它提示的是哪个 ID,因为异常文本不清楚。尝试暂时删除级联指令,看看它是否仍然发生,尝试缩小范围。

如有必要,您可以强制 session “忘记”给定 ID 的任何现有对象(使用 Hibernate API 中的 Session.evict(),或 EntityManager.detach( ) 在 JPA 2.0 API 中),但这不是一个非常优雅的解决方案。

重申一下——这个异常与数据库约束完全无关,它与 Hibernate 保护其内部内存状态的一致性有关。

关于java - Hibernate 和 NonUniqueObjectException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3543716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com