hibernate 的级联保存和关联关系

Customer 和 Orders 是一对多的关系,Orders和Customer是多对一关系,即这两个双向关联.

Customer 和Bid是一对一的关系,一对一的关系就不存在双向和单向了

 

如下是他们的类:

customer.java

 

Java代码   收藏代码
  1. package com.reflesh;  
  2.   
  3. import java.util.Date;  
  4. import java.util.HashSet;  
  5. import java.util.Set;  
  6.   
  7. public class Customer {  
  8.   
  9.  private int id;  
  10.  private String name;  
  11.  private Date date;  
  12.  private String tele;  
  13.  private Bid bidId;  
  14.  private Set ordersId = new HashSet();           //省略set 和get 方法  
  15.     }  

 

orders.java

Java代码   收藏代码
  1. public class Orders {  
  2. private Long orderId;  
  3. private String name;  
  4. private Customer customer;  
Java代码   收藏代码
  1. // 省略掉equals和haseCode()  
Java代码   收藏代码
  1. Bid.java  
Java代码   收藏代码
  1. <pre class="java" name="code">private Long bidId;  
  2.  private String name;  
  3.  private Customer customerBId;  
  4.    
  5.     
  6.  }</pre>  
  7.    
Java代码   收藏代码
  1. customer.hbm.xml  
Java代码   收藏代码
  1.  <id name="id" column="customerId" type="int">  
  2.       <generator class="sequence">  
  3.         <param name="sequence">customerId</param>         
  4.       </generator>  
  5.     </id>  
  6.     <property name="name"  column="name"  type="string" />    
  7.     <property name="date"     column="orderDate"     type="date"/>   
  8.     <property name="tele"  column="telephone"  type="string"/>   
  9.    <set name="ordersId"   cascade="save-update" inverse="true">  
  10.        <key column="customerOId"/>  
  11.        <one-to-many class="com.reflesh.Orders" />  
  12.    </set>  
  13.    
  14.    <one-to-one name="bidId" class="com.reflesh.Bid" property-ref="customerBId" cascade="save-update"/>  
  15.    

 orders.hbm.xml

Java代码   收藏代码
  1. <id name="orderId" column="orderId2" type="long">  
  2.       <generator class="sequence">  
  3.         <param name="sequence">seq_order</param>         
  4.       </generator>  
  5.     </id>  
  6.     <property name="name"  column="name"  type="string" />    
  7.    <many-to-one   
  8.         name="customer"   
  9.         class="com.reflesh.Customer"   
  10.         column="customerOId"  
  11.           
  12.          />  

 bid.hbm.xml

Java代码   收藏代码
  1. <id name="bidId" column="bidId" type="long">  
  2.       <generator class="sequence" >  
  3.        <param name="sequence">seq_bid</param>        
  4.       </generator>      
  5.     </id>  
  6.     <property name="name"  column="name"  type="string" />    
Java代码   收藏代码
  1. <many-to-one name="customerBId" class="com.reflesh.Customer"  
  2.    column="customerBId"  unique="true" />  

 test.java

Java代码   收藏代码
  1. Session session =HibernateSessionFactory.getSession();  
  2.         
Java代码   收藏代码
  1.                                /* 关联类*/  
  2.  Customer c = new Customer();  
  3.   c.setName("bellwind");  
  4.   Date date = RefleshActionHelper.FormatDate("2004-05-09""yyyy-mm-dd");  
  5.   c.setDate(date);  
  6.   c.setTele("123456");  
  7.   Serializable  id = null;  
  8.   Orders o = new Orders();  
  9.   o.setName("订单1dfdf");  
  10.        o.setCustomer(c);  
  11.    Orders o2 = new Orders();  
  12.    o2.setName("订单2");  
  13.    o2.setCustomer(c);  
  14.                   c.getOrdersId().add(o);  
  15.                   c.getOrdersId().add(o2);        
  16.                Bid bid = new Bid();  
  17. bid.setName("ijd");  
  18. bid.setCustomerBId(c);  
  19. c.setBidId(bid);  
Java代码   收藏代码
  1. /* 关联类完*/     
  2. try {  
  3.    tr = session.beginTransaction();  
  4.     id = session.save(c); //三个都保存         
  5.     tr.commit();  
  6. catch (Exception e) {  
  7.     e.printStackTrace();  
  8.     tr.rollback();  
  9. }  
  10. finally {  
  11.     session.close();  
  12. }  
  13. return id;  

 

说明:a,b,c为级联的步骤

a.在set属性上加 cascade="save-update"

b. 关联类 见代码test.java的注释

c. 保存customer一个就行了,因为customer表是主表,orders表的外键customerOId和Bid表的外键customerBId    都关系到customer表的主键;

注意:

a.一般都选择保存customer来级联保存orders和bids,不选择保存orders或者bids来级联保存customer;

b. 没有.inverse="true",执行如下语句

insert into customer (name, orderDate, telephone, customerId) values (?, ?, ?, ?)
Hibernate: insert into orders (name, customerOId, orderId2) values (?, ?, ?)
Hibernate: insert into orders (name, customerOId, orderId2) values (?, ?, ?)
Hibernate: insert into bid (name, customerBId, bidId) values (?, ?, ?)
Hibernate: update orders set customerOId=? where orderId2=?
Hibernate: update orders set customerOId=? where orderId2=?

有了inverse="true",执行如下语句
insert into customer (name, orderDate, telephone, customerId) values (?, ?, ?, ?)
Hibernate: insert into orders (name, customerOId, orderId2) values (?, ?, ?)
Hibernate: insert into orders (name, customerOId, orderId2) values (?, ?, ?)
Hibernate: insert into bid (name, customerBId, bidId) values (?, ?, ?)
可以看出减少了2条语句,提高了性能

 

 

customer单向关联orders的步骤:

1.

customer.hbm.xml

Java代码   收藏代码
  1. <set name="ordersId"   cascade="save-update" inverse="true">  
  2.        <key column="customerOId"/>  
  3.        <one-to-many class="com.reflesh.Orders" />  
  4.    </set>  

 

2.orders.hbm.xml 不用配关联到customer, 删除<many-to-one >元素

3.orders类的customer属性删除

4.只需单向关联

Customer c = new Customer();

 Bid bid = new Bid();
c.setBidId(bid);

5.save(c) 就行了

注意:

如果是customer单向关联orders,那么inverse="true" 不可以少,否则orders表的外键为null,它需要

Hibernate: update orders set customerOId=? where orderId2=?
Hibernate: update orders set customerOId=? where orderId2=?

这两句来更新orders表的外键


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值