在一对多关系中更新父实体时,如何更新子实体?

时间:2018-08-16 12:44:19

标签: hibernate spring-boot jpa one-to-many

我有两个分别称为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());        
}

1 个答案:

答案 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);
     }
 }

这样,您的双向关系就始终保持最新状态。