在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是数据库字段名