組件(Component)類必須在類一級(jí)定義
@Embeddable
注解.
在特定的實(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;

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

}
說(shuō)明:
1.
Person
有兩個(gè)組件屬性,分別是
homeAddress
和
bornIn
.
homeAddress
屬性并沒(méi)有注解. 但是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通過(guò)在表達(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;