What does relationship owner means in bidirectional relationship?
Your first example is normal and correct bidirectional one-to-many/many-to-one mapping. Setting Question
to Choice
-attribute ("owning side") is enough to have relationship persisted. Entity graph in memory will be messed until other side of the relationship is read from database again. From the
database point-of-view owner is the entity that is persisted to table that have foreign key column (same for bidirectional one-to-one). In specification this is explained following way:
The many side of one-to-many / many-to-one bidirectional relationships must be the owning side, hence the mappedBy element cannot be specified on the ManyToOne annotation.
....
Bidirectional relationships between managed entities will be persisted based on references held by the owning side of the relationship. It is the developer’s responsibility to keep the in-memory references held on the owning side and those held on the inverse side consistent with each other when they change. In the case of unidirectional one-to-one and one-to-many relationships, it is the developer’s responsibility to insure that the semantics of the relationships are adhered to.
In JPA terms your second example does not have owning side, because of absence of mappedBy
. Instead you have two unidirectional relationships which are forced to use same column as store. At least with Hibernate 3.5.6 it will behave following way:
- Setting
Question
tochoice
-attribute will not persist relationship. - Adding
Choice
toquestion
-attribute will not persist relationship. - To persist value to
"QUESTION_ID"
both have to be set (yes, also not-insertable
question
).
Bidirectional relationships must follow these rules:
- The inverse side must refer to its owning sideby using the mappedBy attribute
- The owning side may have the inversedBy attribute
- @ManyToOne is always the owning side of a bidirectional association
- @OneToMany is always the inverse side of a bidirectional association
- the owning side of a @OneToOne association is the entity with the table containing the foreign key
- The many side of many-to-one bidirectional relationships must not define the mappedBy attribute
- For many-to-many bidirectional relationships, either side may be the owning side