我已经在Hibernate
上提到了各种文档,并且最终在这个问题上得到了一个非常简单的答案。
我只想澄清我对这个问题的最终简单回答是否正确。请帮忙
这是我的回答
Inverse是hibernate中tag的一个属性。它通常用于OneToMany / ManyToOne
双向映射。
inverse="true"
表示子实体是两个实体之间关系的所有者,子实体应该使用子表中的外键列来处理持久性操作。
答案 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。