3.2.2.3. 組み込みオブジェクト (コンポーネントとも呼ばれます)


エンティティ内部に組み込みコンポーネントを宣言したり、カラムマッピングを上書きしたりできます。コンポーネントクラスは、@Embeddable アノテーションを使用してクラスレベルでアノテートする必要があります。関連するプロパティの @Embedded および @AttributeOverrideアノテーションを使用して特定のエンティティに対する組み込みオブジェクトのカラムマッピングを上書きできます。
@Entity
public class Person implements Serializable {

    // Persistent component using defaults
    Address homeAddress;

    @Embedded
    @AttributeOverrides( {
            @AttributeOverride(name="iso2", column = @Column(name="bornIso2") ),
            @AttributeOverride(name="name", column = @Column(name="bornCountryName") )
    } )
    Country bornIn;
    ...
}
Copy to Clipboard Toggle word wrap
@Embeddable
public class Address implements Serializable {
    String city;
    Country nationality; //no overriding here
}
Copy to Clipboard Toggle word wrap
@Embeddable
public class Country implements Serializable {
    private String iso2;
    @Column(name="countryName") private String name;

    public String getIso2() { return iso2; }
    public void setIso2(String iso2) { this.iso2 = iso2; }

    
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    ...
}
Copy to Clipboard Toggle word wrap
組み込みオブジェクトは、独自のエンティティのアクセスタイプを継承します。このアクセスタイプは、Hibernate 固有の @AccessType アノテーションを使用して上書きできることに注意してください (「Hibernate Annotation 拡張機能」 を参照)。
Person エンティティ Bean は、 homeAddressbornIn の 2 つのコンポーネントプロパティを持ちます。homeAddress プロパティはアノテートされませんでしたが、Hibernate は Address クラスの @Embeddable アノテーションを検索してそのプロパティが永続コンポーネントであることを推測します。また、カラム名のマッピング (bornCountryName に対する) を Country のマップされた各属性に対する @Embedded アノテーションと @AttributeOverride アノテーションで上書きします。示されたように、Country も Hibernate および EJB3 のデフォルトでの自動検出を使用した Address のネストされたコンポーネントです。EJB3 仕様では組み込みオブジェクトのカラムの上書きは現在サポートされていませんが、Hibernate Annotations ではドット付きの式を使用してサポートされます。
    @Embedded
    @AttributeOverrides( {
            @AttributeOverride(name="city", column = @Column(name="fld_city") ),
            @AttributeOverride(name="nationality.iso2", column = @Column(name="nat_Iso2") ),
            @AttributeOverride(name="nationality.name", column = @Column(name="nat_CountryName") )
            //nationality columns in homeAddress are overridden
    } )
    Address homeAddress;
Copy to Clipboard Toggle word wrap
Hibernate Annotationsは、EJB 仕様で明示的に対応されていない機能をもう一つサポートしています。@MappedSuperclassアノテーションのある組込みオブジェクトをアノテートし、スーパークラスプロパティーを永続化することができます(詳細は@MappedSuperclassを参照してください)。
EJB3 仕様によりサポートされませんが、Hibernate Annotations では組み込みオブジェクトの関連付けアノテーション (@*ToOne@*ToMany など) を使用できます。関連付けカラムを上書きするために、@AssociationOverride を使用できます。
同じエンティティで同じ組み込み可能なオブジェクトタイプを 2 回使用する場合は、カラム名のデフォルト設定は機能しません。少なくとも 1 つのカラムが明示的である必要があります。Hibernate は EJB3 仕様の範囲を超え、NamingStrategy を使用してデフォルト設定メカニズムを拡張できます。DefaultComponentSafeNamingStrategy は、同じエンティティで使用された場合であっても組み込みオブジェクトをデフォルト設定できるデフォルトの EJB3NamingStrategy を少し改良したものです。
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2025 Red Hat