gpt4 book ai didi

java - hibernate中删除相关对象

转载 作者:行者123 更新时间:2023-12-02 08:36:20 26 4
gpt4 key购买 nike

我有一个包含两个类的 hibernate 模型,假设 A 和 B。B 对 A 具有多对一引用。

我查询单个 A 和单个 B 对象。它们与 session 分离,并在其他地方进行处理/使用。 B.A 属性是一个惰性代理。稍后 A 和 B 都需要删除。我创建一个新 session 并调用 .delete(A).delete(B)

删除A是可以的,但是删除B会导致以下异常,

Caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: com.xxx.hibernate.objects.B.A
at org.hibernate.engine.Nullability.checkNullability(Nullability.java:95) [hibernate3.jar:na]
at org.hibernate.event.def.DefaultDeleteEventListener.deleteEntity(DefaultDeleteEventListener.java:272) [hibernate3.jar:na]
at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:163) [hibernate3.jar:na]
at org.hibernate.event.def.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:74) [hibernate3.jar:na]
at org.hibernate.impl.SessionImpl.fireDelete(SessionImpl.java:794) [hibernate3.jar:na]
at org.hibernate.impl.SessionImpl.delete(SessionImpl.java:772) [hibernate3.jar:na]

在代码中挖掘,看起来在删除期间完成了可空性检查,并且由于 A 首先被删除,所以 B 的删除无法通过空检查。即使我传入的 B 对象设置为非空,它也认为 A 引用为“空”。看起来它在内部 Session 状态中进行了一些查找并找到了已删除的 A 实例。

有人知道我该如何解决这个问题吗?如果可能的话,我宁愿不依赖删除的顺序,除非由于某种我没有看到的原因,在 B 之前删除 A 是根本错误的。

我也不完全确定为什么删除时需要进行空检查。

最佳答案

我认为您必须先删除所有“子级”,然后才能删除“父级”。我知道您不想受到删除顺序的影响,但我认为没有其他方法可以解决此问题。

只是一个想法,但请看看在删除的每个步骤中实际到达数据库的内容。如果 Hibernate 设置为使用表的所有列(包括链接到 A 的外键)创建 DELETE 命令,那么当 DELETE 命令查找 A 键的 NULL 值时,它不会找到任何内容。

关于java - hibernate中删除相关对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1649366/

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