我有以下表实体,因为我正在尝试更新现有记录,同时这样做,我收到以下错误。我知道我在实体定义中犯了一些错误,但无法弄清楚。 感谢您的帮助。
**A
-------------------
| |
B C
---------
| |
D E**
@Entity
@Table()
public class A {
@Id
Long id;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name = "id", referencedColumnName="id", nullable = false)
private Set<B> b;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name = "id", referencedColumnName="ID", nullable = false)
private Set<C> c;
}
@Entity
@Table()
public class B{
@Id
Long id;
}
@Entity
@Table()
public class C{
@Id
Long id;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name = "id", referencedColumnName="id", nullable = false)
private Set<D> D;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval=true)
@JoinColumn(name = "id", referencedColumnName="ID", nullable = false)
private Set<E> E;
}
@Entity
@Table()
public class D{
@Id
Long id;
}
@Entity
@Table()
public class E{
@Id
Long id;
}
错误:
org.hibernate.HibernateException:具有 cascade="all-delete-orphan" 的集合不再被所属实体实例引用:com.entity.C.D
at org.hibernate.engine.internal.Collections.processDereferencedCollection(Collections.java:100) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
at org.hibernate.engine.internal.Collections.processUnreachableCollection(Collections.java:51) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
at org.hibernate.event.internal.AbstractFlushingEventListener.flushCollections(AbstractFlushingEventListener.java:262) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:95) ~[hibernate-core-5.3.12.Final.jar:5.3.12.Final]
在保存模式下,您只需将列表设置为实体即可工作, 但在更新模式下,首先您需要清除实体的列表,然后将列表添加到其中,不要设置列表,
在保存模式下 =>
person.setAddress(addressList);
在更新模式下 =>
person.getAddress().clear();
person.getAddress().addAll(updatedAddressList);
映射取决于关联的所有权,考虑到您的示例,很难指出,但是您可以查看这篇文章以更好地了解使用一种或另一种方法以及数据库中的后果。我不知道您的更新是否是这种情况,但是当您更新子项时,您需要清除过去的集合并使用addAll方法来避免此类错误。也检查这篇文章。