现在的位置: 主页 > 公司荣誉 > 文章列表

精通Hibernate——映射组成关系

作者:福建省医学会血液病学分会 来源:www.fjhematology.org 发布时间:2017-09-12 16:32:46
 

精通Hibernate——映射组成关系

建立域模型与关系型数据模型有着不同的出发点。域模型是由程序代码组成,通过细化持久化类的粒度提供代码可重用度,简化编程。关系数据模型由关系数据组成。存在数据冗余的情况下,需要把粗粒度的表拆分为具有外键参照关系的几个细粒度表,从而节省表的存储空间;另一方面在没有数据冗余的前提下,应尽可能减少表的数量,简化表之间的参照关系,以便提高数据库的访问速度。
由于建立域模型和关系型数据的原则不一样,使得持久化类的数目往往比数据库中表的数量要多,而且持久化类的属性并不和表字段一一对应,下面Customer类的homeAddress属性以及comAddress属性均和CUSTOMER表中多个字段对应
例如:

// 地址公共类 @MapperedSuperclass//如果是注解则标注此 public class Address{ private String province; private String city; private String street; private String zipcode; private Customer customer; private Customer getCustomer(){ return customer; } private void setCustomer(Customer customer){ this.customer = customer; } } // 客户信息类 @Table(name="CUSTOMER") public class Customer extends Address{ private String id; private String name; private Address homeAddress; private Address comAddresss; }

在创建对象关系映射文件时,不能使用property元素来映射homeAddress属性,而要使用component元素,如下:

component元素表示homeAddress是Customer类的一个组成部分,在Hibernate中称之为组件,他有如下两个属性:
1.name:设定被映射的持久化类的属性名,此处为Customer类的homeAddress属性
2.class:设定homeAddress属性的类型,此处表明homeAddress属性为Address类型
component元素还包含一个parent元素和一个property元素,parent元素指定Address类所属的整体类,这里设为customer,与此对应,在Address类中应该定义一个customer属性,并提供get、set方法。
component元素的property子元素用来配置组件类的属性和表中字段的映射。

1、区分值(Value)类型和实体(Entity)类型
以上Address类并没有OID,这是Hibernate组件一个重要特征。由于Address类没有OID,因此不能通过Session来单独保存、更新、删除或加载一个Address,否则会抛出MappingException。
值类型和实体类型重要的区别是前者没有OID,不能被单独持久化,他的生命周期依赖于所属的持久化类的对象的生命周期,组件类型就是一种值类型;而实体类型有OID,可以被单独持久化。

2、映射复合组成关系
例如CPUBox是Computer的一个组件,而CPUBox本身还包含一个GraphicsCard组件,此外,CPUBox还和Vender多对一关联。
配置如下:

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网站开发公司 https://www.feimao666.com

  • 上一篇:外贸企业如何巧妙布局网络赢销海外
  • 下一篇:最后一页
  •