我有一个带有Question和Choice对象的简单模型。
Question
Choice
有两种使用Hibernate来实现的方法
实施一:所有者是选择
Question.java
@OneToMany (mappedBy="question") private Set choices = new HashSet();
Choice.java
@ManyToOne @JoinColumn (name="QUESTION_ID") private Question question;
实施二:所有者方是质询
@OneToMany @JoinColumn (name = "QUESTION_ID") private Set choices = new HashSet();
@ManyToOne @JoinColumn (name="QUESTION_ID", updatable = false, insertable = false) private Question question;
两种实现之间有什么区别?
第一个示例是正常且正确的双向一对多/多对一映射。设置Question为Choice-attribute(“拥有方”)足以保持关系。内存中的实体图将被弄乱,直到再次从数据库中读取关系的另一端为止。从数据库的角度来看,所有者是持久保存到具有外键列的表的实体(与双向一对一相同)。在规范中对此进行了以下解释:
一对多/多对一双向关系的多面必须是拥有方,因此无法在ManyToOne批注上指定mappingBy元素。 ....受 管实体之间的双向关系将根据该关系拥有方所拥有的引用来保留。当它们更改时,开发人员有责任使在内存中拥有的引用和在内存中相反的引用彼此保持一致。在单向一对一和一对多关系的情况下,开发人员有责任确保遵守这些关系的语义。
一对多/多对一双向关系的多面必须是拥有方,因此无法在ManyToOne批注上指定mappingBy元素。 ....受
管实体之间的双向关系将根据该关系拥有方所拥有的引用来保留。当它们更改时,开发人员有责任使在内存中拥有的引用和在内存中相反的引用彼此保持一致。在单向一对一和一对多关系的情况下,开发人员有责任确保遵守这些关系的语义。
用JPA术语,由于缺少,您的第二个示例没有所有权mappedBy。相反,您有两个单向关系,它们被迫使用与存储相同的列。至少对于Hibernate 3.5.6,它将表现为以下方式:
mappedBy
choice
question
"QUESTION_ID"
insertable