【问题标题】:Hibernate: mapping parent to child entity with 2 references to one column in child?Hibernate:将父实体映射到子实体,其中包含对子实体一列的 2 个引用?
【发布时间】:2016-04-28 15:33:52
【问题描述】:

我正在尝试在我的实体中使用cascade delete。但我认为,我有 2 引用了我的孩子entity 中的一列这一事实阻止了它。

在我的子 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>();

在我添加第二个子引用和父引用之前,级联删除对我的所有实体都有效。但是,由于我添加了它们,因此没有。

我该如何解决这个问题?

【问题讨论】:

    标签: java entity-framework hibernate cascade


    【解决方案1】:

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

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

    顺便说一句:仅在一侧(负责将关系存储在数据库中的一侧)设置它,在某些情况下也可以存储和重新加载实体。 (你会在许多旧教程中发现这个肮脏的把戏)。但在我看来,这是不好的做法。 (在您的测试用例中,需要在保存子节点后重新加载父节点之前清理缓存。)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      相关资源
      最近更新 更多