在JPA中,mappedBy的作用是什么,在Hibernate中,inverse =“true”是什么?

时间:2014-07-10 01:35:17

标签: java database hibernate orm foreign-keys

我已经在Hibernate上提到了各种文档,并且最终在这个问题上得到了一个非常简单的答案。

我只想澄清我对这个问题的最终简单回答是否正确。请帮忙

这是我的回答

Inverse是hibernate中tag的一个属性。它通常用于OneToMany / ManyToOne双向映射。

inverse="true"表示子实体是两个实体之间关系的所有者,子实体应该使用子表中的外键列来处理持久性操作。

2 个答案:

答案 0 :(得分:2)

你的答案是正确的。

"反向"是在数据库中总是有一方控制关系(例如FK方面),而在你的双向域模型映射中你可以改变一对多方(添加/删除子)和子方(设置父级)。这就是双方需要保持同步的原因。

Hibernate不能自动强制执行同步约束,因此开发人员有责任实现同步约束。 Hibernate唯一能做的就是只观察一面(为了将状态转换转换为SQL查询)。

因此,提供像工具方法一样的add / removeChild是个好习惯:

@Entity
public class Parent {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", orphanRemoval = true)
    private List<Child> children = new ArrayList<Child>();

    public List<Child> getChildren() {
        return children;
    }

    public void addChild(Child child) {
        children.add(child);
        child.setParent(this);
    }

    public void removeChild(Child child) {
        children.remove(child);
        child.setParent(null);
    }
}

答案 1 :(得分:0)

除了@Vlad正确指出的内容之外,另一个影响DML查询(至少是Hibernate如何做)的副作用是,非逆向状态变化的DML是单个查询(更新外键是DML的一部分而不是两个。这很好地说明了here