我有两个分别称为A和B的实体。模型如下。
class A {
@OneToMany(fetch = FetchType.LAZY,mappedBy = "child", cascade={CascadeType.ALL} , orphanRemoval = true)
private Set<B> children = new HashSet<>();
}
class B {
@ManyToOne(fetch= FetchType.LAZY)
@JoinColumn(name="a_id")
@JsonIgnore
private A child;
}
我要在更新类A时更新类B。现在可以说,我在A中有3个B实例。更新时,我想从中删除一个实例。但是现在,这没有发生。但是,如果我需要在A上添加一个新的B,它就可以工作。我做错了什么?请告诉我。 要更新实体,我使用了以下内容。
public update A(A object){
A existing = aDao.find(object.getID()) // retrieve the existing object A;
for(B obj: object.getB()){ // this will create if there are new entities, but, i need to remove alreadet saved B instance if they are not in updated object
obj.setA(existing);
}
existing.setB(object.getB());
}
答案 0 :(得分:0)
确保对A中的子项调用remove并将B中的子项设置为null:
a.getChildren().remove(b);
b.setA(null);
一件很棒的事情就是所谓的便捷方法,您将它放在案例A的一侧:
public class A {
// existing code
// Convenience mehtods
public void addChild(B b) {
children.add(b);
b.setA(this);
}
public void removeChild(B b) {
children.remove(b);
b.setA(null);
}
}
这样,您的双向关系就始终保持最新状态。