8.22.28 @ManyToMany
(1) 説明
ManyToManyリレーションシップの関係を持つ所有者側のエンティティクラスから被所有者側のエンティティクラスへの複数の関連を指定するアノテーションです。
ManyToManyリレーションシップは,双方向,単方向に関係なく,所有者側と被所有者側を持ちます。関係が双方向の場合,結合表の指定はどちらの側でも指定できます。
なお,Genericsを使用してCollection要素型が指定されている場合,被所有者側のエンティティクラスを指定する必要はありません。そのほかの場合は,必ず指定してください。
また,@ManyToManyを指定した場合は,次に示すアノテーションの設定に注意してください。
-
@OneToManyのための同じアノテーションの属性は,@ManyToManyと同じ属性を持ちます。
-
所有者側と被所有者側のクラスで@ManyToManyを定義したプロパティまたはフィールドが同じ名前の場合は,@JoinTableのデフォルト設定(joinColumns属性,inverseJoinColumns属性の指定がない状態)を使用しないでください。
-
双方向関係の場合には,所有者側の情報を基に結合表の値が更新されます。mappedBy属性を指定したエンティティクラスでマッピング情報を変更しても,その情報は結合表には反映されません。
適用可能要素は,メソッドとフィールドです。
(2) 属性
@ManyToManyの属性の一覧を次の表に示します。
属性名 |
任意/必須 |
属性の説明 |
---|---|---|
任意 |
被所有者側のエンティティクラスを指定する属性です。 |
|
任意 |
カスケード対象となるオペレーションを指定する属性です。 |
|
任意 |
フェッチ戦略の指定値を指定する属性です。 |
|
任意 |
被所有者側のエンティティクラスの要素に付与して,所有者側のエンティティクラスで関係を保持しているフィールドまたはプロパティの名前を指定する属性です。 |
CJPAプロバイダで対応する属性の詳細を次に示します。
(a) targetEntity属性
- 型
-
Class
- 説明
-
被所有者側のエンティティクラスを指定する属性です。
Genericsを使って定義されているコレクションプロパティの場合は,任意で指定します。それ以外の場合は必ず指定してください。
- デフォルト値
-
コレクションのパラメタ化された型
注 Genericsを使って定義されているときにだけ設定されます。
(b) cascade属性
- 型
-
CascadeType[]
- 説明
-
カスケード対象となるオペレーションを指定する属性です。
指定できる値を次に示します。
-
CascadeType.ALL:所有者側のエンティティクラスのpersist,remove,merge,refreshの操作が関連先にカスケードされます。
-
CascadeType.MERGE:所有者側のエンティティクラスのmerge操作が関連先にカスケードされます。
-
CascadeType.PERSIST:所有者側のエンティティクラスのpersist操作が関連先にカスケードされます。
-
CascadeType.REFRESH:所有者側のエンティティクラスのrefresh操作が関連先にカスケードされます。
-
CascadeType.REMOVE:所有者側のエンティティクラスのremove操作が関連先にカスケードされます。
-
- デフォルト値
-
カスケード対象なし
(c) fetch属性
- 型
-
FetchType
- 説明
-
データベースからのデータのフェッチ戦略を定義する属性です。フェッチ戦略については,「8.4.5 データベースとの同期」を参照してください。
指定できる値は,次の2種類です。
-
EAGER戦略:データがEAGERにフェッチされなければならない要求
-
LAZY戦略:データが最初にアクセスされるときに,LAZYにフェッチされる要求
-
- デフォルト値
-
FetchType.LAZY
(d) mappedBy属性
- 型
-
String
- 説明
-
被所有者側のエンティティクラスの要素に付与し,所有者側のエンティティクラスで関係を保持しているフィールドまたはプロパティの名前を指定する属性です。
この属性を指定した場合,関係は双方向になります。双方向関係の場合には所有者側の情報を基に結合表の値は更新されます。被所有者側のエンティティクラス(mappedBy属性を指定したエンティティクラス)でマッピング情報を変更しても,その情報は結合表には反映されません。
- デフォルト値
-
なし