[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是数据库字段名
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值