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


 

posted @ 2014-03-28 15:50  郁闷的耗子  阅读(352)  评论(0编辑  收藏  举报