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

}
說(shuō)明:
1. Person 有兩個(gè)組件屬性,分別是 homeAddress 和 bornIn . homeAddress 屬性并沒有注解. 但是Hibernate自動(dòng)檢測(cè)其對(duì)應(yīng)的Address類中的 @Embeddable 注解, 并將其看作一個(gè)持久化組件.
2.對(duì)于Country中已映射的屬性,則使用 @Embedded 和 @AttributeOverride 注解來(lái)覆蓋原來(lái)的字段映射值。
3. Address 對(duì)象中還內(nèi)嵌了 Country 對(duì)象, Hibernate通過在表達(dá)式中使用"."支持覆蓋多層嵌套(即嵌入式對(duì)象中還包括其他嵌入式對(duì)象)的字段映射.如下:
@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帛羅閣 閱讀(3019) 評(píng)論(0) 編輯 收藏 所屬分類: 開源軟件