zoukankan      html  css  js  c++  java
  • 攻城狮在路上(壹) Hibernate(八)--- 映射Hibernate组成关系

    一、使用组成关系的原则
      在不导致数据冗余的前提下,尽可能减少数据库表的数目及表之间的外键参照关系,因为建立多个表的连接是很耗时的操作。
      举例说明:Customer类中的Address属性,可以通过组件的方式来映射,避免了额外建立一张ADDRESS表,还能达到对象化操作的目的。
      配置文件:

    <component name="homeAddress" class="mypack.Address">
      <parent name="customer" />
      <property name="province" type="string" column="HOME_PROVINCE"/>
      <property name="city" type="string" column="HOME_CITY"/>
      <property name="street" type="string" column="HOME_STREET"/>
      <property name="zipcode" type="string" column="HOME_ZIPCODE"/>
    </component>

      说明:

    name:设定被映射的持久化类的属性名。
    class:设定homeAddress属性的类型。
    <parent>:指定Address类所属的整体类。

      注意:区分是否存在组成关系。Hibernate组件Address没有OID。
      1、区分 值类型和实体类型
        Hibernate组件Address没有OID,因此不能通过Session来单独保存、更新、删除或加载一个Address对象。当使用以下方法时:

    session.load(Address.class,new Long(1));
    session.save(address);
    session.update(address);
    session.delete(address);

      会抛出org.hibernate.MappingException:Unknow entity class: xx.xxx.Address。
      值类型没有OID,不能被单独持久化,它的生命周期依赖于所属的持久化类的对象的生命周期。
    二、映射复合组成关系
      一个Hibernate组件可以包含其他的Hibernate组件,获取其他实体类关联。
      配置文件同上,仅是在component中嵌套一个component即可。
    三、Hibernate组件总结:以Address为例
      1、没有OID,在数据库中没有对应的表。
      2、不需要单独创建Address类的映射文件。
      3、不能单独持久化Address对象。Address对象的生命周期依赖于其整体类对象的生命周期。
      4、其他持久化类不允许关联Address类。
      5、Address类可以关联其他持久化类。
      6、在component元素中还可以嵌套component元素,用于映射复合组成关系。

    声明:该文所有内容均来自《精通Hibernate:Java对象持久化技术详解》[孙卫琴 电子工业出版社] 一书。该文的目的仅仅作为学习笔记。若需要转载,请注明原书相关信息。

  • 相关阅读:
    Matlab编辑器背景修改
    Booksim的运行
    illustrator画梯形
    latex去掉页眉
    latex字体颜色
    latex字体
    Methods to reduce the number of pipeline stages
    Basic Router Architecture
    Linux /sbin/service脚本一个基本无影响的bug
    HTML5实战之桌面通知
  • 原文地址:https://www.cnblogs.com/tq03/p/3766555.html
Copyright © 2011-2022 走看看