8.6.3 リレーションシップの方向
リレーションシップには,双方向のリレーションシップと単方向のリレーションシップがあります。双方向のリレーションシップを扱う場合,リレーションシップには所有者と被所有者があります。単方向のリレーションシップには所有者だけがあります。リレーションシップの所有者は,データベースのリレーションシップの更新を決定できます。
双方向のリレーションシップでは,次のルールが適用されます。
-
双方向のリレーションシップの被所有者は,@OneToOne,@OneToMany,@ManyToManyのmappedBy要素によって,所有者を指定します。mappedBy要素では,所有者のエンティティで,被所有者側を参照しているプロパティまたはフィールドの名前を指定します。
-
ManyToOne/OneToMany双方向のリレーションシップでは,many側を所有者にしてください。そのため,mappedBy要素は@ManyToOneでは指定できません。
-
OneToOneの双方向のリレーションシップでは,外部キーを含む側のエンティティが所有者になります。
-
ManyToManyの双方向のリレーションシップは,どちらが所有者でもかまいません。
リレーションシップのアノテーションにはcascade属性があります。cascade属性を指定すると,エンティティに対する操作を参照先のエンティティに対しても伝播させることができます。ただし,リレーションシップのアノテーションのcascade属性にREMOVEを指定できるのは,OneToOneまたはOneToManyのときだけです。ほかのリレーションに対してcascade=REMOVEを適用した場合の動作は保証しません。エンティティがリレーションシップを持つ場合のcascade属性については,「8.4.1(4) エンティティに対する操作の伝播」を参照してください。
- 注意事項
-
CJPAプロバイダでは,実行時のリレーションシップの一貫性を保つためのチェックは実施しません。このため,アプリケーションの実行時にリレーションシップを更新する場合に,リレーションシップに矛盾が発生するような更新を行っても,警告や例外は発生しません。
なお,OneToMany,ManyToManyなどのコレクションのリレーションシップでは,データベースから値をフェッチした場合に,関連するエンティティが存在しないときには,リレーションシップの値として空のコレクションを返します。