3.2.2.3. 組み込みオブジェクト (コンポーネントとも呼ばれます)
エンティティ内部に組み込みコンポーネントを宣言したり、カラムマッピングを上書きしたりできます。コンポーネントクラスは、
@Embeddable アノテーションを使用してクラスレベルでアノテートする必要があります。関連するプロパティの @Embedded および @AttributeOverrideアノテーションを使用して特定のエンティティに対する組み込みオブジェクトのカラムマッピングを上書きできます。
組み込みオブジェクトは、独自のエンティティのアクセスタイプを継承します。このアクセスタイプは、Hibernate 固有の
@AccessType アノテーションを使用して上書きできることに注意してください (「Hibernate Annotation 拡張機能」 を参照)。
Person エンティティ Bean は、 homeAddress と bornIn の 2 つのコンポーネントプロパティを持ちます。homeAddress プロパティはアノテートされませんでしたが、Hibernate は Address クラスの @Embeddable アノテーションを検索してそのプロパティが永続コンポーネントであることを推測します。また、カラム名のマッピング (bornCountryName に対する) を Country のマップされた各属性に対する @Embedded アノテーションと @AttributeOverride アノテーションで上書きします。示されたように、Country も Hibernate および EJB3 のデフォルトでの自動検出を使用した Address のネストされたコンポーネントです。EJB3 仕様では組み込みオブジェクトのカラムの上書きは現在サポートされていませんが、Hibernate Annotations ではドット付きの式を使用してサポートされます。
@MappedSuperclassアノテーションのある組込みオブジェクトをアノテートし、スーパークラスプロパティーを永続化することができます(詳細は@MappedSuperclassを参照してください)。
EJB3 仕様によりサポートされませんが、Hibernate Annotations では組み込みオブジェクトの関連付けアノテーション (
@*ToOne や @*ToMany など) を使用できます。関連付けカラムを上書きするために、@AssociationOverride を使用できます。
同じエンティティで同じ組み込み可能なオブジェクトタイプを 2 回使用する場合は、カラム名のデフォルト設定は機能しません。少なくとも 1 つのカラムが明示的である必要があります。Hibernate は EJB3 仕様の範囲を超え、
NamingStrategy を使用してデフォルト設定メカニズムを拡張できます。DefaultComponentSafeNamingStrategy は、同じエンティティで使用された場合であっても組み込みオブジェクトをデフォルト設定できるデフォルトの EJB3NamingStrategy を少し改良したものです。