在我的应用程序中,一个hibernate操作就像这样.应用程序使用请求中的新值更新父实体,并删除所有现有(先前插入的)子实体并插入新的子记录.
我正在使用冬眠DELETE_ORPHAN,如下所示.
当我这样做时,我得到以下异常:
org.hibernate.HibernateException:拥有实体实例不再引用cascade ="all-delete-orphan"的集合: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;
................
...............
}
Run Code Online (Sandbox Code Playgroud)
子实体具有组合键,并且具有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;
}
Run Code Online (Sandbox Code Playgroud)
Java代码
...................
..............
parent.getChild().clear();
Child child = new Child();
parent.setChild(child);
Run Code Online (Sandbox Code Playgroud)
这可能有什么不对.
提前致谢...
JB *_*zet 52
您的最后一段Java代码无法编译.我猜它看起来像
parent.getChilds().clear(); // note: you should name it children rather than childs
parent.setChilds(someNewSetOfChildren):
Run Code Online (Sandbox Code Playgroud)
不要做最后的指示.不要用另一个替换该集合,清除该集合并将新子节点添加到已清除的集合中:
parent.clearChildren();
parent.addChildren(someNewSetOfChildren);
Run Code Online (Sandbox Code Playgroud)
方法定义为:
public void clearChildren() {
this.children.clear();
}
public void addChildren(Collection<Child> children) {
this.children.addAll(children);
}
Run Code Online (Sandbox Code Playgroud)
应该完全删除setChildren方法,或者应该用以下实现替换它:
public void setChildren(Collection<Child> children) {
this.children.clear();
this.children.addAll(children);
}
Run Code Online (Sandbox Code Playgroud)
它对我有用.
我没有将新的子实体设置为我的父对象,而是使用addAll方法添加新的子实体.
parent.getChildren().clear();
parent.getChildren().addAll(newChildrenList);
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY,
cascade = CascadeType.ALL, orphanRemoval = true)
public Set<Children> getChildren() {
return this.children;
}
Run Code Online (Sandbox Code Playgroud)小智 8
而不是setChilds使用addAll,
由此,
parent.getChilds().clear();
parent.setChilds(newChilds);
Run Code Online (Sandbox Code Playgroud)
到
parent.getChilds().clear();
parent.getChilds().addAll(newChilds);
Run Code Online (Sandbox Code Playgroud)
我面临同样的问题,并解决如下:
1- 在该元素的所有实体子节点中的所有@OneToMany注释中添加{CascadeType.ALL},orphanRemoval = true.
2-检查这些实体的hashcode()和equalls(),有时它们有错误
3-请勿使用,parent.setChilds(newChilds);因为引擎会要求错过对孩子的引用,但请改用
parent.getChilds().clear();
parent.getChilds().add(Child);
Run Code Online (Sandbox Code Playgroud)
要么
parent.getChilds().addAll(Childs);
Run Code Online (Sandbox Code Playgroud)
经过4个小时的研究,这些步骤解决了我的问题
| 归档时间: |
|
| 查看次数: |
63279 次 |
| 最近记录: |