关系所有者在双向关系中意味着什么?

Syd*_*ney 27 hibernate

我有一个简单的模型QuestionChoice对象.

  • 一个问题有很多选择(S).
  • 很多选择有一个问题

使用Hibernate有两种方法可以实现

实施一:业主方是选择

Question.java

@OneToMany (mappedBy="question")
private Set choices = new HashSet();
Run Code Online (Sandbox Code Playgroud)

Choice.java

@ManyToOne
@JoinColumn (name="QUESTION_ID")
private Question question;
Run Code Online (Sandbox Code Playgroud)

实施二:业主方是问题

Question.java

@OneToMany
@JoinColumn (name = "QUESTION_ID")
private Set choices = new HashSet();
Run Code Online (Sandbox Code Playgroud)

Choice.java

@ManyToOne
@JoinColumn (name="QUESTION_ID", updatable = false, insertable = false)
private Question question;
Run Code Online (Sandbox Code Playgroud)

这两个实现有什么区别?

Mik*_*unu 17

您的第一个示例是正常且正确的双向一对多/多对一映射.设置QuestionChoice-attribute("拥有方")足以保持关系.内存中的实体图将被混乱,直到再次从数据库中读取关系的另一侧.从数据库的角度来看,所有者是持久化到具有外键列的表的实体(对于双向一对一相同).在规范中,这将按以下方式解释:

一对多/多对一双向关系的许多方面必须是拥有方,因此不能在ManyToOne批注上指定mappedBy元素.
....
管理实体之间的双向关系将根据关系所属方所持有的引用来保持.开发人员有责任保持内存引用保持在拥有方,而保持在反方保持的内容引用在更改时保持一致.在单向一对一和一对多关系的情况下,开发人员有责任确保遵守关系的语义.

在JPA术语中,你的第二个例子没有拥有方,因为没有mappedBy.相反,您有两个单向关系,强制使用相同的列作为存储.至少对于Hibernate 3.5.6,它将按以下方式运行:

  • 设置Questionchoice-attribute不会保持关系.
  • 添加Choicequestion-attribute不会保持关系.
  • 要保持"QUESTION_ID"两者的价值必须设置(是的,也不是 - insertable question).