[Hibernate Annotations] 嵌入組件(Component)映射
組件(Component)類必須在類一級定義
@Embeddable
注解.
在特定的實體的關聯屬性上使 @Embedded 和 @AttributeOverride 注解可以覆蓋該屬性對應的嵌入式對象的字段映射:
說明:
1. Person 有兩個組件屬性,分別是 homeAddress 和 bornIn . homeAddress 屬性并沒有注解. 但是Hibernate自動檢測其對應的Address類中的 @Embeddable 注解, 并將其看作一個持久化組件.
2.對于Country中已映射的屬性,則使用 @Embedded 和 @AttributeOverride 注解來覆蓋原來的字段映射值。
3. Address 對象中還內嵌了 Country 對象, Hibernate通過在表達式中使用"."支持覆蓋多層嵌套(即嵌入式對象中還包括其他嵌入式對象)的字段映射.如下:
在特定的實體的關聯屬性上使 @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;

}
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;

}
@Embeddable
public ? class ?Address? implements ?Serializable?{
String?city;
Country?nationality;? // no?overriding?here
}
public ? class ?Address? implements ?Serializable?{
String?city;
Country?nationality;? // no?overriding?here
}
@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;?}

}
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;?}

}
說明:
1. Person 有兩個組件屬性,分別是 homeAddress 和 bornIn . homeAddress 屬性并沒有注解. 但是Hibernate自動檢測其對應的Address類中的 @Embeddable 注解, 并將其看作一個持久化組件.
2.對于Country中已映射的屬性,則使用 @Embedded 和 @AttributeOverride 注解來覆蓋原來的字段映射值。
3. Address 對象中還內嵌了 Country 對象, Hibernate通過在表達式中使用"."支持覆蓋多層嵌套(即嵌入式對象中還包括其他嵌入式對象)的字段映射.如下:
@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;
@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;
posted on 2007-03-07 16:17 zJun's帛羅閣 閱讀(3012) 評論(0) 編輯 收藏 所屬分類: 開源軟件