@Target(value={METHOD,FIELD})
@Retention(value=RUNTIME)
public @interface ManyToMany
すべての多対多関連は二つの側を持ちます。所有側と被所有側(もしくは逆側)です。
結合テーブルは所有側で指定されます。
リレーションシップが双方向である場合、被所有側はManyToMany
アノテーションのmappedBy
要素を使用して、
所有側のリレーションシップのフィールドまたはプロパティを指定する必要があります。
リレーションシップの結合テーブルは、デフォルトでない場合は所有側で指定します。
ManyToMany
アノテーションはエンティティクラス内に含まれる組み込みクラス内で使用されたエンティティのコレクションへのリレーションシップを指定することができます。
リレーションシップが双方向であり、組み込みクラスを含むエンティティがリレーションシップの所有側である場合、被所有側は組み込みクラスのリレーションシップのフィールドまたはプロパティを指定するためにManyToMany
アノテーションのmappedBy
要素を使用する必要があります。
組み込み属性内のリレーションシップの属性を示すには、mappedBy
要素でドット(".")表記を使用する必要があります。
ドット表記で使用される各識別子の値は、それぞれの組み込みフィールドまたはプロパティの名前です。
Example 1: // In Customer class: @ManyToMany @JoinTable(name="CUST_PHONES") public Set<PhoneNumber> getPhones() { return phones; } // In PhoneNumber class: @ManyToMany(mappedBy="phones") public Set<Customer> getCustomers() { return customers; } Example 2: // In Customer class: @ManyToMany(targetEntity=com.acme.PhoneNumber.class) public Set getPhones() { return phones; } // In PhoneNumber class: @ManyToMany(targetEntity=com.acme.Customer.class, mappedBy="phones") public Set getCustomers() { return customers; } Example 3: // In Customer class: @ManyToMany @JoinTable(name="CUST_PHONE", joinColumns= @JoinColumn(name="CUST_ID", referencedColumnName="ID"), inverseJoinColumns= @JoinColumn(name="PHONE_ID", referencedColumnName="ID") ) public Set<PhoneNumber> getPhones() { return phones; } // In PhoneNumberClass: @ManyToMany(mappedBy="phones") public Set<Customer> getCustomers() { return customers; }
JoinTable
修飾子とタイプ | 任意要素と説明 |
---|---|
CascadeType[] |
cascade
(オプション) 関連付けの対象にカスケードする必要のある操作。
|
FetchType |
fetch
(オプション) 関連付けを遅延ロード(LAZY)するか、即座に取得(EAGER)する必要があるかどうか。
|
java.lang.String |
mappedBy
リレーションシップを所有するフィールド。
|
java.lang.Class |
targetEntity
(オプション) 関連付けの対象のエンティティクラス。
|
public abstract java.lang.Class targetEntity
ジェネリクスを使用して定義されている場合、デフォルトはコレクションのパラメタライズドタイプです。
public abstract CascadeType[] cascade
対象のコレクションがjava.util.Map
である場合、
cascade
属性はMapの値に適用されます。
デフォルトではすべての操作はカスケードされません。
public abstract FetchType fetch
訳注:つまりEAGERは必ず有効になり、LAZYが有効になるかは実装に依存します。
Translated by @megascus.