Hibernate:将父级映射到子实体,其中2个引用到子级中的一列?

时间:2016-04-28 15:33:53

标签: java entity-framework hibernate cascade

我想在我的实体中设置cascade delete。但我认为,由于我对孩子entity中的一列有 2 引用这一事实而停止了这一点。

在我的孩子Dog实体中,我最初有以下字段:

 @Column(name = "KENNEL_ID", insertable = false, updatable = false)
    private String kennelId;    

然后我添加了这个,因为我想获得与父母相关的所有子实体的列表:

 @ManyToOne
    @JoinColumn(name = "KENNEL_ID" )
    private Kennel kennel;

在我的父级Kennel实体中,我还添加了这个来引用我添加的子项中的字段:

 @OneToMany(mappedBy = "kennel",cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    private List<Dog> dogList= new ArrayList<Dog>();

在我添加第二个子引用和父引用之前,cascade delete适用于我的所有实体。但是,因为我添加了它们,所以没有。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

将父和子映射到同一个类不是问题。问题是你需要手工维护双向关系的两端。

child.setParent(parent)
parent.addChild(child)

顺便说一句:只在一侧设置它(负责在数据库中存储关系的那个),存储和重新加载实体在某些情况下也会起作用。 (你会在许多旧教程中找到这个肮脏的技巧)。但在我看来,这是不好的做法。 (在您的测试用例中,在保存子项后重新加载父项之前,需要清理缓存。)

public void setDogList(List<Dog> dogList) {
        this.dogList.clear();
        this.dogList.addAll(dogList);
    }