zoukankan      html  css  js  c++  java
  • Hibernate中inverse、cascade的说明

       一: 前沿:刚刚学习hibernate时,对于inverse很是纠结,不知道什么时候该用什么时候不该用,在网上找了一些资料,说的也很含糊,我都不知道如果写了"inverse=true"时,到底是有谁来维护。下面我来说下自己的最终理解。


       二:我那客户(Customer)和订单(Order)来说,一个客户有多个订单,一个订单属于一个客户。所以在学生的Order.hbm.xml中就是多对一的关系。在Customer中就是一对多。所以给出Customer中德配置如下:

      

    <class name="com.shengsiyuan.hibernate.Customer" table="customers">
            <id name="id" column="id" type="long">
                <generator class="increment"></generator>
            </id>
        
            <property name="name" type="string">
                <column name="name" length="50"></column>
            </property>
            
            <!-- 这里的lazy设置为false,表示立即加载,而不是延迟加载 -->
      这里把Customer。hbm.xml中的inverse设置为true表示客户与订单之间的关系由订单来维护,下面我会在测试类中会说明一些问题
      <set name="orders" cascade="all" inverse="true" lazy="true"> 
      <key column="customer_id"></key>
      <one-to-many class="com.shengsiyuan.hibernate.Order"/> </set>
    </class>

    在Order.hbm.xml中德配置如下:

      

     1     <class name="org.wh.hibernate.Order" table="orders">
     2         <id name="id" column="id" type="long">
     3             <generator class="increment"></generator>
     4         </id>
     5         
     6         <property name="orderNumber" type="string">
     7             <column name="order_Number" length="15"></column>
     8         </property>
     9         
    10         <many-to-one name="customer" class="org.wh.hibernate.Customer" column="customer_id" lazy="false">
    11         </many-to-one>        
    12         
    13     </class>

    在看HiberanteTest中德类的代码:

      

     1             tx=session.beginTransaction();
     2             
     3             Customer customer=new Customer();
     4             
     5             customer.setName("zhangsan");
     6             customer.setOrders(new HashSet());
     7             
     8             Order order1=new Order();
     9             order1.setOrderNumber("order1");
    10             
    11             Order order2=new Order();
    12             order2.setOrderNumber("order2");
    13             
    14             Order order3=new Order();
    15             order3.setOrderNumber("order3");
    16             
    17             //由于是双向一对多的关系
    18             
    19             //多到一
    --------------如果在这里面没有添加以下三行代码,则会使order表中的外键为空值(null),因为在hbm.xml中我们是让订单表来维护客户和订单之间的关系,而在保存的时候保存的确是
    --------------customer对象,所以要在代码中设置order和customer的关系。-------------------------如果把customer中德inverse去掉,即默认为false,那么就不需要加下面--------------几行代码,因为此时的关系是两方都在维护,所以在保存customer时会保存相应的order信息----------------------------------------------------------------------------不能将两边的配置中德inverse都同时设置为true,这样的结果是你让我来管,我要你来管,结果可想而知,。。。。。任何一方的操作都不会触发到对方表的信息 20 order1.setCustomer(customer); 21 order2.setCustomer(customer); 22 order3.setCustomer(customer); 23 24 //一到多 25 customer.getOrders().add(order1); 26 customer.getOrders().add(order2); 27 customer.getOrders().add(order3); 28 29 session.save(customer); 30 tx.commit();

    三:在说cascade中德作用,cascade就是级联的意思,就是说在保存主对象时,相应的从属对象也要保存,删除主对象时,那么相应的从属对象也要被删除。就拿上述的Customer和Order两张表来说,在Customer.hbm.xml中德cascade=“all”,表示操作customer时,会保存相应的order信息,所以如果删除该customer,那么对应的Order表的信息也会删除。暂时我的理解就是这样,向cascade还有好几种属性,save-update等会再以后细作说明。  


    四:感悟:通过这几天的学习,觉得hibernate的配置还是很麻烦的,马上都快实习的,觉得时间不够用,而且最近对那些jquery,json都不是很理解,那种写法,好郁闷阿。OGBL自己还得在理解一边,每天还得去上课,真的好烦人啊。最近上extsj,老师一节课就把书给上完了,晕死。还是自己学吧。路漫漫啊。一步一个脚印吧。GO!Go!Go!,预祝自己学的好,并且找到一份好的实习工作吧。


  • 相关阅读:
    How to alter department in PMS system
    Can't create new folder in windows7
    calculate fraction by oracle
    Long Wei information technology development Limited by Share Ltd interview summary.
    ORACLE BACKUP AND RECOVERY
    DESCRIBE:When you mouse click right-side is open an application and click left-side is attribution.
    ORACLE_TO_CHAR Function
    电脑BOIS设置
    JSP点击表头排序
    jsp+js实现可排序表格
  • 原文地址:https://www.cnblogs.com/wuhao1991/p/3630849.html
Copyright © 2011-2022 走看看