【发布时间】:2011-07-15 18:01:37
【问题描述】:
如果父对象从 3 个子对象的列表开始,删除子 1 并调用 session.update(parent),我需要什么样的休眠映射才能从删除的子表中清除父 PK彻底删除被移除的孩子?
我还有一个约束可以防止任何父项被分配给它时被删除,另一个约束可以防止我意外级联删除任何子条目。
我可以通过简单地调用 session.update(parent) 成功地级联更新子级,但是我在执行相反的操作时遇到了麻烦。
public class Parent implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private List<Child> children;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@OneToMany(mappedBy = "parent")
@org.hibernate.annotations.Cascade(
value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE})
public List<Child> getChildren() {
return children;
}
public void setChildren(List<Child> children){
this.children = children;
for(Child child : children) {
child.setParent(this);
}
}
//----------------- Would I need something like this? ---------------
//----------------- Or does hibernate have a better way? ---------------
public void setChildren(List<Child> children){
for(Child child : this.children)
if (!children.contains(child)) {
child.setParent(null);
}
}
this.children = children;
for(Child child : children) {
child.setParent(this);
}
}
//----------------------------------------------------------------
}
public class Child implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Parent parent;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@ManyToOne
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
}
此解决方案类似,但我没有删除父级,而是从列表中删除一个子级:
【问题讨论】: