Hibernate 在双向关系中,关系所有者是什么意思?

Hibernate 在双向关系中,关系所有者是什么意思?,hibernate,Hibernate,我有一个带有问题和选择对象的简单模型 一个问题有很多选择 许多选择都有一个问题 有两种方法可以通过Hibernate实现这一点 实施一:所有者方是选择 Question.java @OneToMany (mappedBy="question") private Set choices = new HashSet(); @OneToMany @JoinColumn (name = "QUESTION_ID") private Set choices = new HashSet(); Cho

我有一个带有
问题
选择
对象的简单模型

  • 一个问题有很多选择
  • 许多选择都有一个问题
有两种方法可以通过Hibernate实现这一点

实施一:所有者方是选择

Question.java

@OneToMany (mappedBy="question")
private Set choices = new HashSet();
@OneToMany
@JoinColumn (name = "QUESTION_ID")
private Set choices = new HashSet();
Choice.java

@ManyToOne
@JoinColumn (name="QUESTION_ID")
private Question question;
@ManyToOne
@JoinColumn (name="QUESTION_ID", updatable = false, insertable = false)
private Question question;
实施二:业主方有疑问

Question.java

@OneToMany (mappedBy="question")
private Set choices = new HashSet();
@OneToMany
@JoinColumn (name = "QUESTION_ID")
private Set choices = new HashSet();
Choice.java

@ManyToOne
@JoinColumn (name="QUESTION_ID")
private Question question;
@ManyToOne
@JoinColumn (name="QUESTION_ID", updatable = false, insertable = false)
private Question question;

这两种实现之间的区别是什么?

您的第一个示例是正常且正确的双向一对多/多对一映射。将
Question
设置为
Choice
-属性(“拥有方”)足以保持关系。在再次从数据库中读取关系的另一端之前,内存中的实体图将一直处于混乱状态。从 数据库视点所有者是持久化到具有外键列的表的实体(对于双向一对一相同)。在本规范中,以下方式对此进行说明:

一对多/多对一双向关系的多方面 必须是拥有方,因此不能使用mappedBy元素 在多通批注上指定。
..
双向的 托管实体之间的关系将基于 关系的拥有方持有的引用。它是 开发人员有责任保留内存中的引用 拥有方和持有方在相反方与 当他们改变的时候,他们会互相帮助。在单向一对一的情况下 以及一对多关系,开发人员有责任 确保关系的语义得到遵守

在JPA术语中,由于缺少
mappedBy
,您的第二个示例没有拥有方。相反,您有两个单向关系,它们被强制使用与存储相同的列。至少在Hibernate 3.5.6中,它的行为方式如下:

  • Question
    设置为
    choice
    -属性将不会保持关系
  • 选项
    添加到
    问题
    -属性将不会保持关系
  • 若要将值持久化为
    “问题ID”
    ,必须同时设置这两个值(是的,也不可插入)
同样重要的是要记住,如果没有
mappedBy
,您将遇到循环依赖的问题。当双向关系中没有所有者时,就会发生这种情况

在循环依赖关系中,您将(显式)在保存之前设置实体的两侧

thisObj.set(thatObj);
thatObj.set(thisObj);

证明我是错的,但我相信仅更改非拥有方不会自动反映在数据库中(使用脏检查),而修改拥有方而不修改另一方是错误的。注意,在本例中,多方是所有者的自然选择,因为它在数据库级别上有外键?例如:设置选项。如果您不使用它,hibernate如何确定在哪里(什么类?)找到您在mappedBy注释中引用的“question”属性。。或者hibernate不知何故意识到了这一点。。或者我不知道这在幕后是如何运作的。。