多对一关联映射(映射文件)


 <many-to-one .../>标签属性

 Column: 指定进行关联的外键列的列名,该列名默认与该属性同名

 class:指定关联实体的全限定类名,默认是通过反射得到该属性所属类的类名。

 cascade:该属性指定哪些持久化操作会从主表记录级联到子表记录。

 fetch:该属性指定Hibernate的抓取策略,属性值只能是join(使用外连抓取)select(使用选择抓取)两个值的其中之一。

 updateinsert:指定对应的字段是否包含在用于Hibernate生成的updateinsert语句中,两个属性的默认值都是true。如果将二者指定为false,则表明这是一个纯粹的外源关联,它的值是通过映射同一个(或多个)字段的其他属性得到的,或由触发器或其他程序来负责完成。

 property-ref:指定关联类的一个属性,这个属性将会和本类的外键相对应(当外键参照唯一键时需指定该属性)。如果没有指定,直接使用对方关联的主键。

 access:指定hibernate访问此关联属性的访问策略,默认是property.

 unique:指定Hibernate通过DDL为外键列添加唯一约束。此外,也可以用做property-ref的目标属性。这使关联同时具有一对一的效果。

 not-null:指定使用DDL为外键字段添加非空约束。

 optimistic-lock:该属性指定其更新时是否需要获得乐观锁定,也就是其他值决定引用关联实体的属性发生变化时版本值是否增长。

 lazy:是否延迟加载可接收的值为falseproxyno-proxy三个值。

 not-found:该属性指定当外键参照的主表记录不存在时如何处理。该属性只接受ignoreexception两个值,默认是exception,即不存在时抛出异常;如果程序希望Hibernate忽略这个异常,则可指定该属性值为ignore

 formula:指定一个SQL表达式,该外键值将根据该SQL表达式来计算。


多对一单向关联映射

     

实现概述:

            1.在多的一方设置一个外键关联

            2.在多的一方实体类中维护另一个实体的引用

            3.在多的一方使用<many-to-one .../>标签映射,一般设置not-null=true


   假如有两张表t_customers(客户表)和t_orders(订单表),其中t_orders表的customer_id字段和t_customers表的id字段进行关联,形成多对一关系。

 

1、建立t_orders和t_customers表

    create table if not exists webdb.t_orders(

         id int(11) not null,

         Order_number varchar(10) not null,

          customer_id int(11) not null,

         PRIMARY key (id),

          Unique  key address_id (address_id)

     )ENGINE=InnoDB  DEFAULT CHARSET=utf-8 COLLATE=utf8_unicode_ci;


     create table if not exists webdb.t_customer(

          id int(11) not null,

          namevarchar(50) not null,

          PRIMARY key (id)

      )ENGINE=InnoDB  DEFAULT CHARSET=utf-8 COLLATE=utf8_unicode_ci;

2、对应的实体

   public class Customer{

      private Integer id;

      private String name;

      . .  .

   }


    public class Order{

       private Integer id;

       private String number;

       private Customer  customer;

       .  .  .

   }

3、对应的映射文件配置:

   Order.hbm.xml:

   <class name="org.hibernate.test.Order"  table="t_orders">

        <id name="id" column="id" type="int">

               <generator class="native"/>

        </id>

       <property name="number" column="order_number" type="string"/>

       <!-- 用于映射关联实体 -->

       <many-to-one name="customer" class="org.hibernate.test.Address" 

                                           column=customer_id cascade="save-update" />

   </class>

  Customer.hbm.xml

   <class name="org.hibernate.test.Customer" table="t_customers">

         <id name="id" column="id" type="int">

             <generator class="intiva/>

         </id>

         <property name="name" column="name" type="sring" />

</class>


一对多双向关联映射

  实现概述:

          1.在多的一方设置一个外键

          2.在多的一方维护另一个实体的引用,在另一个实体类中维护一个集合

          3.在多的一方使用<many-to-one .../>标签设置,在另一方使用<set .../>标签配置

  1、建立t_orders和t_customers表

    create table if not exists webdb.t_orders(

         id int(11) not null,

         Order_number varchar(10) not null,

          customer_id int(11) not null,

         PRIMARY key (id),

          Unique  key address_id (address_id)

     )ENGINE=InnoDB  DEFAULT CHARSET=utf-8 COLLATE=utf8_unicode_ci;


     create table if not exists webdb.t_order(

          id int(11) not null,

          namevarchar(50) not null,

          PRIMARY key (id)

      )ENGINE=InnoDB  DEFAULT CHARSET=utf-8 COLLATE=utf8_unicode_ci;

2、对应的实体

   public class Customer{

       private Integer id;

       private String name;

       private Set<Order> orders = new HashSet<Order>();

          . .  .

}


    public class Order{

       private Integer id;

       private String number;

       private Customer  customer;

       .  .  .

 }

3、对应的映射文件配置:

   Order.hbm.xml:

   <class name="org.hibernate.test.Order"  table="t_orders">

           <id name="id" column="id" type="int">

                <generator class="native"/>

           </id>

           <property name="number" column="order_number" type="string"/>

          <!-- 用于映射关联实体customer_id为外键 -->

            <many-to-one name="customer" class="org.hibernate.test.Address" 

                                column=customer_id cascade="save-update" lazy=false not-null=true/>

  </class>

  Customer.hbm.xml

  <class name="org.hibernate.test.Customer" table="t_customers">

            <id name="id" column="id" type="int">

                 <generator class="intiva/>

            </id>

            <property name="name" column="name" type="sring" />

                <!-- inverse表示关联关系的维护工作由谁负责,默认为false,表示由主控方负责维护,如果为true,则表示由被控方来维护关联工作 -->

              <set name="order" cascade="save-update,delete" order-by="order_number asc" lazy="true" inverse=false”>

                 <key column="customer_id"/>

                     <one-to-many class="org.hibernate.test.Orders"/>

           </set>

  </class>

注意:虽然很多时候在装载Customer对象时,自动装载Order对象显得很方便,但是如果只想获得Customer对象中的信息,这时在装载Order对象就显得有些得不偿失,因此,在上面的配置代码中将<set>标签的lazy属性设置为true,这样就可以使hibernate框架只在使用Customer的orders属性时才装载Order对象。如果程序未访问orders属性,Hibernate是不会自动装载Order对象的。


一对多双向自身关联映射

例如商品分类,通常用一张表来存放所有的商品分类,分类之间的层级关系是典型的自身一对多双向关联关系。


1、建立t_goodscates表

    create table if not exists webdb.t_goodcates(

         id int(11) not null,

          parent_id  int(11),

         cate_no varchar(30) not null,

          cate_name varchar(30) not null,

         PRIMARY key (id)

     )ENGINE=InnoDB  DEFAULT CHARSET=utf-8 COLLATE=utf8_unicode_ci;

2、对应的实体

   public class Goodscate{

          private Integer id;

          private String cateNo;

          private String cateName;

          private Goodscate parent;

          Private Set<Goodscate>  childs = new HashSet<Goodscate>();

          . .  .

}

3、对应的映射文件配置:

   Goodscate.hbm.xml:

   <class name="org.hibernate.test.Goodscate"  table="t_products">

           <id name="id" column="id" type="int">

                  <generator class="native"/>

           </id>

           <property name="cateNo" column="cate_no" type="string"/>

           <property name="cateName" column="cate_name" type="string"/>

         <!-- 映射子类别到父类别的多对一关联 -->

         <many-to-one name="parent" column="parent_id" class="org.hibernate.test.Goodscate" lazy="false"/>

           <!-- 映射父类别到子类别的一对多关联 -->

         <set name="childs" cascade="all" inverse="true" lazy="false">

                     <key column="parent_id"/>

                     <one-to-many class="org.hibernate.test.Goodscate"/>

         </set>

   </class>