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 を使用して一方向関係を定義します。