你的位置:首页 > 软件开发 > Java > hibernate的component使用

hibernate的component使用

发布时间:2016-04-21 00:00:18
hibernate的Component,即组件,表示2个类之间的关系,即其中1个类可以作为另一个类的组件来使用。1.先来看下annotation中关于component的API2.2.2.3. 嵌入式对象(又名组件) 在实体中可以定义一个嵌入式组件(embedded co ...

hibernate的component使用

hibernate的Component,即组件,表示2个类之间的关系,即其中1个类可以作为另一个类的组件来使用。

1.先来看下annotation中关于component的API

2.2.2.3. 嵌入式对象(又名组件)

在实体中可以定义一个嵌入式组件(embedded component), 甚至覆盖该实体中原有的列映射. 组件类必须在类一级定义@Embeddable注解. 在特定的实体的关联属性上使用@Embedded@AttributeOverride注解可以覆盖该属性对应的嵌入式对象的列映射:

@Entitypublic 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;  ...}      
@Embeddablepublic class Address implements Serializable {  String city;  Country nationality; //no overriding here}      
@Embeddablepublic 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; }  ...}      

嵌入式对象继承其所属实体中定义的访问类型 (注意:这可以通过使用Hibernate提供的@AccessType注解来覆盖原有值)(请参考 Hibernate Annotation Extensions).

在上面的例子中,实体bean Person 有两个组件属性, 分别是homeAddressbornIn. 我们可以看到homeAddress 属性并没有注解. 但是Hibernate自动检测其对应的Address类中的@Embeddable注解, 并将其看作一个持久化组件.对于Country中已映射的属性, 则使用@Embedded@AttributeOverride 注解来覆盖原来映射的列名. 正如你所看到的, Address对象中还内嵌了Country对象, 这里和homeAddress一样使用了Hibernate和EJB3自动检测机制. 目前EJB3规范还不支持覆盖多层嵌套(即嵌入式对象中还包括其他嵌入式对象)的列映射. 不过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;

Hibernate注解支持很多EJB3规范中没有明确定义的特性. 例如,可以在嵌入式对象上添加 @MappedSuperclass注解, 这样可以将其父类的属性持久(详情请查阅@MappedSuperclass).

Hibernate现在支持在嵌入式对象中使用关联注解(如@*ToOne@*ToMany). 而EJB3规范尚不支持这样的用法。你可以使用 @AssociationOverride注解来覆写关联列.

在同一个实体中使用两个同类型的嵌入对象, 其默认列名是无效的:至少要对其中一个进行明确声明. Hibernate在这方面走在了EJB3规范的前面, Hibernate提供了NamingStrategy, 在使用Hibernate时, 通过NamingStrategy你可以对默认的机制进行扩展. DefaultComponentSafeNamingStrategy 在默认的EJB3NamingStrategy上进行了小小的提升, 允许在同一实体中使用两个同类型的嵌入对象而无须额外的声明.

 

2.再来看下

第 8 章 组件(Component)映射


原标题:hibernate的component使用

关键词:Hibernate

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录