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