zoukankan      html  css  js  c++  java
  • Hibernate4.x之映射关系--双向1-n

    双向1-n与双向n-1是完全相同的两种情形

    双向1-n需要在1的一端可以访问n的一端,反之亦然。

    域模型:从Order到Customer的多对一双向关联需要在Order类中定义一个Customer属性,而在Customer类中需定义存放Order对象的集合属性

    关系数据模型:ODDERS表中的CUSTOMER_ID参照CUSTOMER表的主键

    当Session从数据库中加载Java集合时,创建的是Hibernate内置集合类的实例,因此在持久化类中定义集合属性时必须把属性声明为Java接口类型
      -Hibernate的内置集合类具有集合代理功能,支持延迟检索策略
      -事实上,Hibernate的内置集合类封装了JDK中的集合类,这使得Hibernate能够对缓存中的集合对象进行脏检查,按照集合对象的状态来同步更新数据库
    在定义集合属性时,通常把它初始化为集合实现类的一个实例。这样可以提高程序的健壮性,避免应用程序访问取值为null的集合的方法抛出NullPointException

    Hibernate使用<set>元素来映射set类型的属性。<set>节点中主要包括以下三个属性:

      <set>元素的inverse属性
        在Hibernate中通过inverse属性的值来决定是由双向关联的哪一方来维护表和表之间的关系。inverse=false的为主动方,inverse=true的为被动方,由主动方负责维护关联关系
        在没有设置inverse=true的情况下,父子两边都维护父子关系
        在1-n关系中,将n方设为主控方将有助于性能改善
        在1-N关系中,若将1方设为主控方
          会额外多出update语句
          插入数据时无法同时插入外键列,因为无法为外键列添加非空约束

      <set>元素的cascade属性
        在对象-关系映射文件中,用于映射持久化类之间关联关系的元素,<set>,<many-to-one>和<one-to-one>都有cascade属性,它用于指定如何操纵与当前对象关联的其他对象
        delete:通过Session的delete方法删除当前对象时,会级联删除所有关联的对象
        delete-orphan:删除所有和当前对象解除关联关系的对象
        save-update:当通过Session的save,update及saveOrUpdate方法来保存或更新当前对象时,级联保存所有关联的新建的临时对象,并且级联更新所有关联的游离对象

      <set>元素的order-by属性(在数据库中对集合排序)
        <set>元素有一个order-by属性,如果设置了该属性,当Hibernate通过select语句到数据库中检索集合对象时,利用order by子句进行排序
        order-by属性还可以加入SQL函数(DESC, ASC)

    -------------------------------示例代码-------------------------------------------------------------------------------------------------------------

    Customer

     1 package com.yl.hibernate.entities.n21.both;
     2 
     3 import java.util.HashSet;
     4 import java.util.Set;
     5 
     6 public class Customer {
     7     
     8     private Integer customerId;
     9     private String customerName;
    10     /**
    11      * 1.声明集合类型时,需使用接口类型,因为hibernate在获取集合类型时,返回的是Hibernate内置的集合类型,而不是JavaSE一个标准的集合
    12      * 2.需要把集合进行初始化,可以防止发生空指针异常
    13      */
    14     private Set<Order> orders = new HashSet<Order>();
    15     
    16     public Integer getCustomerId() {
    17         return customerId;
    18     }
    19     public void setCustomerId(Integer customerId) {
    20         this.customerId = customerId;
    21     }
    22     public String getCustomerName() {
    23         return customerName;
    24     }
    25     public void setCustomerName(String customerName) {
    26         this.customerName = customerName;
    27     }
    28     public Set<Order> getOrders() {
    29         return orders;
    30     }
    31     public void setOrders(Set<Order> orders) {
    32         this.orders = orders;
    33     }
    34     
    35     
    36 }

    Order

     1 package com.yl.hibernate.entities.n21.both;
     2 
     3 public class Order {
     4     
     5     private Integer orderId;
     6     private String orderName;
     7     
     8     private Customer customer;
     9 
    10     public Integer getOrderId() {
    11         return orderId;
    12     }
    13 
    14     public void setOrderId(Integer orderId) {
    15         this.orderId = orderId;
    16     }
    17 
    18     public String getOrderName() {
    19         return orderName;
    20     }
    21 
    22     public void setOrderName(String orderName) {
    23         this.orderName = orderName;
    24     }
    25 
    26     public Customer getCustomer() {
    27         return customer;
    28     }
    29 
    30     public void setCustomer(Customer customer) {
    31         this.customer = customer;
    32     }
    33     
    34     
    35 }

    Customer.hbm.xml

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     4 <!-- Generated 2014-11-26 19:19:40 by Hibernate Tools 3.4.0.CR1 -->
     5 <hibernate-mapping>
     6     <class name="com.yl.hibernate.entities.n21.both.Customer" table="CUSTOMERS">
     7         <id name="customerId" type="java.lang.Integer">
     8             <column name="CUSTOMER_ID" />
     9             <generator class="native" />
    10         </id>
    11         <property name="customerName" type="java.lang.String">
    12             <column name="CUSTOMER_NAME" />
    13         </property>
    14         
    15         <!-- 映射1对多的那个集合属性 -->
    16         <!-- set: 映射set类型的属性,table:set中的元素对应的记录放在哪一个数据表中,该值需要和多对一的多的那个表的名字一致 -->
    17         <!-- inverse:指定由哪一方来维护映射关系。通常设置为true,以指定由多的一方来维护关联关系 -->
    18         <!-- cascade:设定级联操作。 开发时不建议设定该属性。建议使用手工的方式来处理
    19             delete
    20             delete-orphan
    21             save-update
    22         -->
    23         <!-- order-by 在查询时对集合中的元素排序,order-by中使用的是表的字段名,而不是持久化类的属性名 -->
    24         <set name="orders" table="ORDERS" inverse="true" cascade="delete-orphan" order-by="ORDER_NAME DESC">
    25             <!-- key:指定多的表汇总的外键列的名字 -->
    26             <key column="CUSTOMER_ID"></key>
    27             <!-- 指定映射类型 -->
    28             <one-to-many class="com.yl.hibernate.entities.n21.both.Order"/>
    29         </set>
    30     </class>
    31 </hibernate-mapping>

    Order.hbm.xml

     1 <?xml version="1.0"?>
     2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
     3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     4 <!-- Generated 2014-11-26 19:19:40 by Hibernate Tools 3.4.0.CR1 -->
     5 <hibernate-mapping>
     6     <class name="com.yl.hibernate.entities.n21.both.Order" table="ORDERS">
     7         <id name="orderId" type="java.lang.Integer">
     8             <column name="ORDER_ID" />
     9             <generator class="native" />
    10         </id>
    11         <property name="orderName" type="java.lang.String">
    12             <column name="ORDER_NAME" />
    13         </property>
    14         <!-- 映射多对一的映射关系。使用many-to-one 来映射多对一的关联关系
    15             name:多这一端关联的一那一端的属性的名字
    16             class:一那一端的属性对应的类名
    17             column:一那一端在多的一端对应的数据表中的外键的名字
    18          -->
    19         <many-to-one name="customer" class="com.yl.hibernate.entities.n21.both.Customer" column="CUSTOMER_ID">
    20         </many-to-one>
    21        
    22     </class>
    23 </hibernate-mapping>
  • 相关阅读:
    温故vue对vue计算属性computed的分析
    bootStrap Table 如何使用
    css 的一些知识点的整理
    css 宽高自适应的div 元素 如何居中 垂直居中
    BOM,Dom 回顾
    DOM
    字符串的一些常用方法 string
    js if for 详解 获取元素方式 及一些js 基础知识
    Java入门1
    python字符串
  • 原文地址:https://www.cnblogs.com/dreamfree/p/4127218.html
Copyright © 2011-2022 走看看