3.2.5. エンティティ Bean 関係のマッピング


3.2.5.1. 1 対 1

エンティティ Bean は、@OneToOne を使用して 1 対 1 の関係で関連付けることができます。1 対 1 の関係には 3 つの種類があります。1 つは、関連付けられたエンティティが同じプライマリキー値を共有する場合、もう 1 つは、外部キーがいずれかのエンティティにより保持される場合 (1 対 1 の多様性をシミュレートするためにデータベースのこの FK カラムは制約する必要があることに注意してください)、最後は 2 つのエンティティ間のリンクを保存するために関係テーブルが使用される場合 (1 対 1 の多様性を確保するために各 fk に対して一意の制約を定義する必要があります) です。
最初に、共有されたプライマリキーを使用して実際の 1 対 1 関係をマップします。
@Entity
public class Body {
    @Id
    public Long getId() { return id; }

    @OneToOne(cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn
    public Heart getHeart() {
        return heart;
    }
    ...
}
@Entity
public class Heart {
    @Id
    public Long getId() { ...}
}
@PrimaryKeyJoinColumn アノテーションを使用することにより、1 対 1 は true と指定されます。
以下の例では、関連付けられたエンティティは外部キーカラムによってリンクされます。
@Entity
public class Customer implements Serializable {
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="passport_fk")
    public Passport getPassport() {
        ...
    }

@Entity
public class Passport implements Serializable {
    @OneToOne(mappedBy = "passport")
    public Customer getOwner() {
    ...
}
CustomerCustomer テーブル内の passport_fk という名前の外部キーカラムを使用して Passport にリンクされます。結合カラムは @Column アノテーションに似た @JoinColumn アノテーションで宣言されます。結合カラムには referencedColumnName という名前の 1 つまたは複数のパラメータが含まれます。このパラメータは結合に使用される対象エンティティのカラムを宣言します。非プライマリキーカラムに referencedColumnName を使用する場合は、関連付けられたクラスは Serializable である必要があります。また、非プライマリキーカラムに対する referencedColumnName は、単一カラムを持つプロパティにマップする必要があります (他のクラスは動作しない場合があります)。
関係は双方向にすることができます。双方向の関係では、いずれか (一方のみ) が所有者である必要があります。所有者は関係カラムの更新を担当します。関係を担当しない側を宣言するために属性 mappedBy が使用されます。mappedBy は所有者側の関係のプロパティ名を参照します。この例では、これは passport です。示されたように、結合カラムは所有者側ですでに宣言されているため、宣言する必要はありません (宣言しないでください)。
所有者側で @JoinColumn が宣言されていない場合は、デフォルト値が適用されます。所有者テーブルで結合カラムが作成され、その名前は、所有者側の関係の名前、_ (アンダースコア)、および所有者側のプライマリキーカラムの名前が結合されたものになります。この例では、プロパティ名が passportPassport のカラム ID が id であるため、passport_id になります。
3 つ目の方法 (関係テーブルを使用) は非常に変わったものになります。
@Entity
public class Customer implements Serializable {
    @OneToOne(cascade = CascadeType.ALL)
    @JoinTable(name = "CustomerPassports", joinColumns = @JoinColumn(name="customer_fk"), inverseJoinColumns = @JoinColumn(name="passport_fk")
    )
    public Passport getPassport() {
        ...
    }

@Entity
public class Passport implements Serializable {
    @OneToOne(mappedBy = "passport")
    public Customer getOwner() {
    ...
}
Customer は、CustomerPassports という名前の関係テーブルを使用して Passport にリンクされます。この関係テーブルは、Passport テーブルを参照する passport_fk という名前の外部キーカラム ( inverseJoinColumn により具体化される) と joinColumns 属性により具体化される Customer テーブルを参照する customer_fk という名前の外部キーカラムを持ちます。
このようなマッピングで結合テーブル名と結合カラムを宣言する必要があります。
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

© 2024 Red Hat, Inc.