[Hibernate Annotations] 嵌入组件(Component)映射

在hibernate3.2之前的版本,是用配置文件来进行类与数据库映射,

在3.2之后,可以用JPA来映射,


我们在使用配置文件的时候,有一个重要的标签是Component,用来使用面向数据库和面向对象之间的转换

在面向数据库时候,我们要在一个表中放入尽可能多的字段,来减少表间的连接

在面向对象的时候,我们要将每一个类原子化,以求可以做到类的复用

面向数据库和面向对象之间的鸿沟,我们可以用Component来解决一部份


但是在作用JPA来配置的时候,并没有@javax.persistence.Component标签

那这个时候可以使用怎么来完成呢




我们可以看这个网址的文章 : http://www.blogjava.net/zJun/archive/2007/03/07/102428.html
这篇文章是这么写的 :


组件(Component)类必须在类一级定义 @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;

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

}


说明:

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; 


从这篇文章我们可以看出用JPA来如何来映射Component
在Embeddable的类中,不一定要写@Column
在Entity中的Embedded属性,不写AttributeOverrides就使用Embeddable类中默认的
如果自己写,那么@AttributeOverride中, name就是Embeddable类中的属性名, Column是数据库字段名

你可能感兴趣的:(Hibernate,.net,jpa,嵌入式)