gpt4 book ai didi

hibernate - 拥有级联 ="all-delete-orphan"的集合不再被拥有的实体实例引用

转载 作者:行者123 更新时间:2023-12-03 15:04:40 33 4
gpt4 key购买 nike

在我的应用程序中, hibernate 操作是这样的。
应用程序使用请求中的新值更新父实体,并删除所有现有(之前插入的)子实体并插入新的子记录。

我正在使用 hibernate 模式 DELETE_ORPHAN为此,如下所示。

当我这样做时,我收到以下异常:

org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: com.childs



我看到了与该问题类似的线程,并尝试在这些线程中应用解决方案。但这没有用

我的父实体
    public class Parent implements Serializable {

@Column(name = "PARENT_ID")
@Basic(fetch = FetchType.EAGER)
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
@SequenceGenerator(name = "seq", sequenceName = "seq")
private Integer parentId; //primary key of parent

.......
........

//mapping to child entity
@OneToMany(mappedBy = "parent", cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Set<Child> childs;

................
...............

}

子实体有一个组合键并有一个PK实体如下所示
public class ChildPK implements Serializable {

/** The Constant serialVersionUID. */
private static final long serialVersionUID = -447592368963477750L;

/** . */
@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@JoinColumns( { @JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID") })
@Id
private Parent parent;

/**. */

@Column(name = "CHILD_ID")
@Basic(fetch = FetchType.EAGER)
@Id
@GenericGenerator(name="child_seq", strategy="com.DB2Dialect")
@GeneratedValue(generator="child_seq")
private Integer childId;

}

child entity goes like this:


public class Child implements Serializable {

/** The Constant serialVersionUID. */
private static final long serialVersionUID = 185670997643552301L;

/** The pol cntct id. */
@Column(name = "CHILD_ID")
@Basic(fetch = FetchType.EAGER)
@Id
private Integer childId;

@ManyToOne(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
@JoinColumns( { @JoinColumn(name = "PARENT_ID", referencedColumnName = "PARENT_ID") })
@Id
private Parent parent;

}

Java代码
   ...................
..............
parent.getChild().clear();
Child child = new Child();
parent.setChild(child);

这里可能有什么问题。
提前致谢...

最佳答案

您的最后一段 Java 代码无法编译。我想它看起来像

parent.getChilds().clear(); // note: you should name it children rather than childs
parent.setChilds(someNewSetOfChildren):

不要做最后一条指令。不是用另一个替换集合,而是清除集合并将新的 child 添加到清除的集合中:
parent.clearChildren();
parent.addChildren(someNewSetOfChildren);

其中方法定义为:
public void clearChildren() {
this.children.clear();
}

public void addChildren(Collection<Child> children) {
this.children.addAll(children);
}

setChildren 方法应该完全删除,或者应该用以下实现替换:
public void setChildren(Collection<Child> children) {
this.children.clear();
this.children.addAll(children);
}

关于hibernate - 拥有级联 ="all-delete-orphan"的集合不再被拥有的实体实例引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9430640/

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