3.2.5.3.2. 1 対多


1 対多関係はアノテーション @OneToMany を使用してプロパティレベルで宣言されます。1 対多関係は双方向にできます。
3.2.5.3.2.1. 双方向
EJB3 仕様では、多対 1 は常に双方向関係の所有者側であるため、1 対多関係は @OneToMany( mappedBy=... ) によってアノテートされます。
@Entity
public class Troop {
    @OneToMany(mappedBy="troop")
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk")
    public Troop getTroop() {
    ...
}
Copy to Clipboard Toggle word wrap
Troop はhas a bidirectional one to many relationship troop プロパティを経由した Soldier を持つ双方向の 1 対多関係を持ちます。mappedBy 側で物理的なマッピングを定義しないでください。
1 対多側を所有者側として双方向の 1 対多をマップするには、mappedBy エレメントを削除し、挿入および更新可能な多対 1 の @JoinColumn を false に設定する必要があります。このソリューションは当然最適化されず、いくつかの追加の UPDATE ステートメントが生成されます。
@Entity
public class Troop {
    @OneToMany
    @JoinColumn(name="troop_fk") //we need to duplicate the physical information
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk", insertable=false, updatable=false)
    public Troop getTroop() {
    ...
}
Copy to Clipboard Toggle word wrap
3.2.5.3.2.2. 一方向
所有されたエンティティの外部キーカラムを使用する一方向 1 対多は、それほど一般的ではなく推奨されません。このような関係 (次項で説明) には結合テーブルを使用することが強く推奨されます。このような関係は @JoinColumn を使用して定義されます。
@Entity
public class Customer implements Serializable {
    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @JoinColumn(name="CUST_ID")
    public Set<Ticket> getTickets() {
    ...
}

@Entity
public class Ticket implements Serializable {
    ... //no bidir
}
Copy to Clipboard Toggle word wrap
Customer は、結合カラム CUST_ID を使用する Ticket で一方向関係を示します。
3.2.5.3.2.3. 結合テーブルを使用する一方向
結合テーブルを使用する一方向 1 対多が強く推奨されます。この関係は @JoinTable を使用して定義されます。
@Entity
public class Trainer {
    @OneToMany
    @JoinTable(
            name="TrainedMonkeys",
            joinColumns = @JoinColumn( name="trainer_id"),
            inverseJoinColumns = @JoinColumn( name="monkey_id")
    )
    public Set<Monkey> getTrainedMonkeys() {
    ...
}

@Entity
public class Monkey {
    ... //no bidir
}
Copy to Clipboard Toggle word wrap
Trainer は、結合テーブル TrainedMonkeys を使用する MonkeyTrainer (joinColumns) に対する外部キー trainer_idMonkey (inversejoinColumns) に対する外部キー monkey_id を使用して一方向関係を定義します。
3.2.5.3.2.4. デフォルト値
物理的なマッピングを定義しないと、結合テーブルを使用する一方向 1 対多が使用されます。テーブル名は所有者テーブル名、_、およびもう一方のテーブル名を結合したものです。所有者テーブルを参照する外部キー名は所有者テーブル、_、および所有者プライマリキーカラム名を結合したのものです。もう一方のテーブルを参照する外部キー名は、所有者プロパティ名、_、およびもう一方のプライマリキーカラム名を結合したものです。1 対多を反映するために一意の制約が、もう一方のテーブルを参照する外部キーに追加されます。
@Entity
public class Trainer {
    @OneToMany
    public Set<Tiger> getTrainedTigers() {
    ...
}

@Entity
public class Tiger {
    ... //no bidir
}
Copy to Clipboard Toggle word wrap
Trainer は、結合テーブル Trainer_Tiger を使用する TigerTrainer (テーブル名、_、trainer id) に対する外部キー trainer_idMonkey (プロパティ名、_、Tigerプライマリカラム) に対する外部キー trainedTigers_id を使用して一方向関係を定義します。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat