3.2.5.3.2. 1 対多
1 対多関係はアノテーション
@OneToMany
を使用してプロパティレベルで宣言されます。1 対多関係は双方向にできます。
3.2.5.3.2.1. 双方向 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
EJB3 仕様では、多対 1 は常に双方向関係の所有者側であるため、1 対多関係は
@OneToMany( mappedBy=... )
によってアノテートされます。
Troop
はhas a bidirectional one to many relationship troop
プロパティを経由した Soldier
を持つ双方向の 1 対多関係を持ちます。mappedBy
側で物理的なマッピングを定義しないでください。
1 対多側を所有者側として双方向の 1 対多をマップするには、
mappedBy
エレメントを削除し、挿入および更新可能な多対 1 の @JoinColumn
を false に設定する必要があります。このソリューションは当然最適化されず、いくつかの追加の UPDATE ステートメントが生成されます。
3.2.5.3.2.2. 一方向 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
所有されたエンティティの外部キーカラムを使用する一方向 1 対多は、それほど一般的ではなく推奨されません。このような関係 (次項で説明) には結合テーブルを使用することが強く推奨されます。このような関係は
@JoinColumn
を使用して定義されます。
Customer
は、結合カラム CUST_ID
を使用する Ticket
で一方向関係を示します。
3.2.5.3.2.3. 結合テーブルを使用する一方向 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
結合テーブルを使用する一方向 1 対多が強く推奨されます。この関係は
@JoinTable
を使用して定義されます。
Trainer
は、結合テーブル TrainedMonkeys
を使用する Monkey
、Trainer
(joinColumns
) に対する外部キー trainer_id
、Monkey
(inversejoinColumns
) に対する外部キー monkey_id
を使用して一方向関係を定義します。
3.2.5.3.2.4. デフォルト値 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
物理的なマッピングを定義しないと、結合テーブルを使用する一方向 1 対多が使用されます。テーブル名は所有者テーブル名、_、およびもう一方のテーブル名を結合したものです。所有者テーブルを参照する外部キー名は所有者テーブル、_、および所有者プライマリキーカラム名を結合したのものです。もう一方のテーブルを参照する外部キー名は、所有者プロパティ名、_、およびもう一方のプライマリキーカラム名を結合したものです。1 対多を反映するために一意の制約が、もう一方のテーブルを参照する外部キーに追加されます。
Trainer
は、結合テーブル Trainer_Tiger
を使用する Tiger
、Trainer
(テーブル名、_、trainer id) に対する外部キー trainer_id
、Monkey
(プロパティ名、_、Tigerプライマリカラム) に対する外部キー trainedTigers_id
を使用して一方向関係を定義します。