【问题标题】:Hibernate: bi-directional one-to-many with one as parentHibernate:双向一对多,以一对多为父
【发布时间】:2023-03-17 22:08:02
【问题描述】:

我正在尝试以“one”作为父级设置双向一对多关系

我有一个父母:

@Entity
public class VideoOnDemand {

   @OneToMany(cascade = CascadeType.ALL)
   @LazyCollection(LazyCollectionOption.FALSE)
   @JoinColumn(name = "video_id")
   private List<CuePoint> cuePoints = new ArrayList<CuePoint>();
}

和一个孩子:

@Entity
public class CuePoint {

   @ManyToOne(cascade=CascadeType.ALL)
   @JoinColumn(name = "video_id", insertable = false, updatable = false)
   private VideoOnDemand video;
}

我使用了来自官方 Hibernate documentation (2.2.5.3.1.1) 的建议。但是,Hibernate 似乎不理解 CuePoint 是一个子实体,因此,当我删除 CuePoint 时,它也会删除 VideoOnDemand 以及所有其他 CuePoints。

我做错了什么,正确的方法是什么?

【问题讨论】:

    标签: hibernate one-to-many bidirectional


    【解决方案1】:

    通过这样做,您可以将一个唯一的双向关联映射为两个单向关联。一侧必须标记为另一侧的倒数:

    @Entity
    public class VideoOnDemand {
    
       @OneToMany(mappedBy = "video", cascade = CascadeType.ALL)
       private List<CuePoint> cuePoints = new ArrayList<CuePoint>();
    }
    
    @Entity
    public class CuePoint {
    
       @ManyToOne(cascade = CascadeType.ALL)
       @JoinColumn(name = "video_id", insertable = false, updatable = false)
       private VideoOnDemand video;
    }
    

    mappedBy 属性必须包含关联另一方的属性名称。

    请注意,这确实是第 2.2.5.3.1.1 段中描述的内容。文档。

    【讨论】:

    • JB,按你说的试试。在这种情况下,VideoOnDemand 将是一个孩子,而不是父母。在文档中:“要映射一个双向的一对多,以 一对多作为拥有方,您必须 删除 mappedBy 元素并设置多对一 @JoinColumn 可插入并可更新为 false。”确实,当我删除 CuePoint 时,VideoOnDemand 仍在被删除。更重要的是:现在,当我添加新的 CuePoint 时,“video_id”列是空的(以前不是这样)。
    • Hibernate 中没有子和父的概念。有一个拥有方的概念。为什么你希望一方成为拥有方?请注意,您在问题中描述的级联删除只是由您在关系双方放置的 cascade=ALL 引起的。外键为空是由于在将 cuePoint 添加到列表时未设置 cuePoint 的 video 属性。您必须初始化关联的双方。 Hibernate 使用拥有方来决定关联是否存在。
    • 是的,拥有方是关键。我想,这是关于父母和孩子的关系。现在我知道这真正意味着什么了。好的,我只需要从 CuePoint 中删除 CascadeType.ALL。其实我确实在CuePoint中设置了video属性,只是注释有误。谢谢,JB!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 2011-05-20
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多