为什么Hibernate不设置子级的引用到父级?

4

考虑一个叫做Parent的类:

{
    ...
    @OneToMany(cascade=CascadeType.ALL,mappedBy = "parent")
    Set<Child> children;
    ...
}

而对于Child类:

{
    ...
    @ManyToOne
    @JoinColumn(name="parentID")
    Parent parent;
    ...
}

如果我在应用程序中创建一个新的子对象,并将其放入父对象的children字段中,然后持久化父对象,为什么Hibernate不会自动更新Child对象的父字段(以设置parentID列)?
1个回答

3

因为Hibernate并不是一个神奇的工具。它被设计用来使用你自己设计和编写的POJOs,并且它不会修改这些POJOs的字节码。如果需要,初始化关联的另一侧是你的责任。

另一个原因是,这是JPA规范规定的工作方式,Hibernate必须遵守该规范。

但是,没有什么阻止你拥有一个方法

public void addChild(Child c) {
    this.children.add(c);
    c.parent = this;
}

1
它不需要修改字节码。当保存父对象时,它是否可以仅验证子项是否“已填充”,如果是,则更新子项内部的引用? - user42768
它如何决定你的意图是要将子对象添加到父对象中还是不添加,因为这两个对象并没有说明同样的事情?父对象说:是的,这是我的一个子对象。子对象说:不,我没有任何父对象。那么,Hibernate应该相信谁?子对象还是父对象?规范已经决定:它必须相信关联所有者,也就是子对象。 - JB Nizet
我曾考虑过那种情况,但我认为应该相信关联的“逻辑”所有者。现在我意识到这种方法可能会导致严重的问题。谢谢! - user42768
您上面展示的代码是用于单向关系还是双向关系?如果我的问题太过肤浅,请见谅,我这周才开始接触 Hibernate/JPA/Spring Boot。 - Asma Rahim Ali Jafri
1
@AsmaRahimAliJafri 你应该自己能够弄清楚:如果关系中有两个方向,而且代码显示this有子元素,并且这些子元素有一个父元素,它就是this,那么根据定义,这是一个双向关联。如果是单向的,要么子元素没有父元素(这将是从父元素到子元素的单向OneToMany),要么父元素没有子元素(这将是从子元素到父元素的单向ManyToOne)。 - JB Nizet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接