二、Hibernate进阶

1、many-to-one 关联映射
2、one-to-many 关联映射
  概述:取出one一方的时候也要取出many一方
  基础:
    t_order(t_id,...)
    t_item(t_id,...,t_order_id)
  需求:
    操作Order的时候一般要操作Item
  基本配置:
    class Order{  
      Set<Item> items;
    }
    Order.hbm.xml
      <set name="items" cascade="all-delete-orphan" inverse="true" lazy="false" fetch="join">
        <key column="t_order_id"/>
        <one-to-many class="Item">
      </set>
  基本操作:
    保存Order同时关联保存Item
      此处为级联操作,所以在set中加入属性cascade="save-update"
      因为保存Item的时候需要先有Order对象,所以就有了many-to-one需求
      所以在Order对象中加入 private Order order;
      在Item.hbm.xml中加入<many-to-one name="order" class="Order" column="t_order_id">
      在Order.hbm.xml中加入inverse="true"是为了让many一方Item来维护,one一方Order不维护,就不会在保存数据时有多余的更新操作
    删除Order
      为了级联删除Item,则需设置Cascade="delete"
    更新Order
      Order中解除了和一个Item的关系,希望在数据库中删除对应记录,<set...cascade="delete-orphan"/>或<set...cascade="all-delete-orphan"/>
    查询Order,同时取出Item
      因为笛卡儿积,所以需要考虑重复的问题
      select distinct(o) from Order o join fetch o.items
      查询包含特定Item的Order
      select distinct(o) from Order o join fetch o.items i where i.productName=".."
    查询Order中包含Item的数目
      formula="(select count(*) from t_item i where i.t_order_id=t_id)"
3、many-to-many 关联映射
  概述:Student-Course(三张表两个映射文件)由t_student_course维护关系
  基础:
    t_student(t_id,...)
    t_course(t_id,...)
    t_student_course(t_id,t_student_id,t_course_id)
  需求:
    操作Student的时候一般要操作Course
    操作Course的时候一般要操作Student
  基本配置:
    Class Student{
      private Set<Course> courses;
    }
    Student.hbm.xml:
    <set name="courses" table="t_student_course">
      <key column="t_student_course"/>
      <many-to-many class="Course" column="t_course_id"/>
    </set>
4、继承关联映射
   概述:product-book-computer(三张表同一个映射文件) join-subclass
5、组合映射
   概述:Question-ChoiceQuestion-EssayQuestion(同一张表) discriminator-subclass
6、component映射
person-Address(city+street) 两张表同一映射文件 component

posted @ 2014-05-26 21:22  gowork  Views(242)  Comments(0Edit  收藏  举报