• 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!,预祝自己学的好,并且找到一份好的实习工作吧。


  • 相关阅读:
    Symfony框架实战学习
    学习Symfony之环境的搭建
    js的学习 (数组)
    js的学习 (对象)
    js的学习 (语句)
    Django 应用开发(3)
    Django 应用开发(2)
    Django 学习搭建博客
    2-4.通用选择器
    2-3.class选择器
  • 原文地址:https://www.cnblogs.com/wuhao1991/p/3630849.html
Copyright © 2020-2023  润新知