hibernate中一对多的分析

    刚开始学hibernate时,会对hibernate的一对多映射产生问题,我一开始学的时候也是这样,遇到很多一对多的问题,主要是级联问题,例如一对多级联的查找删除等,很头痛,利用现在的空余时间我自己总结一下。
    public class Order {
         private int id;
         private String userID;
         private Date date;
         private int method;
         private int status;
         private float price;
         private Set lineOrders = new HashSet();//存储订单子项
        //setter,getter函数就省略了
}
    首先就是写hibernate的配置文件,其他的没什么好说的,主要就是set 的映射,
        <set name="lineOrders" table="LINEORDER"  lazy="false" cascade="all-delete-orphan">
             <key column="ORDER_ID"/>
             <one-to-many class="com.NetShop.Model.LineOrder"/>
        </set>
    
    table="LINEORDER" 表示many那边的表名,name="lineOrders"表示Order类中的set 的变量名,column="ORDER_ID"表示many方LineOrder的的外键,使得该类可以通过这个外键找到,级联表中的行赋值给set中的元素。class="com.NetShop.Model.LineOrder"表示many方的对象类型。
    cascade="all-delete-orphan“ 表示添加删除更新实现级联效果。
    
    下面级联删除订单的代码:
    public boolean deleteOrder(int id)
 {
  try{
   
   Transaction tran = this.session.beginTransaction();
   // 执行语句
   Order order = (Order) session.load(Order.class, new Integer(id));
   this.session.delete(order);
   // 提交事务
   tran.commit();
   // 关闭Session
   this.session.close();
   return true;
  
   }
   catch(HibernateException e)
   {
    return false;
   }
 }

    下面是插入订单的代码:
    public boolean insertOrder(Order order,List lines) {
  // TODO Auto-generated method stub
  try{
   Transaction tran = this.session.beginTransaction() ;
   // 执行语句
   this.session.save(order) ;
   int id = order.getId();//因为是用oracle的sequence生成的id不可控,所以要在先存玩oeder后获取id再保存级联的lineorder,不然会出现完整性约束
   for (int i=0; i<lines.size();i++)
   {
    ((LineOrder)lines.get(i)).setOrderID(id);
    this.session.save((LineOrder)lines.get(i)) ;
   }
   // 提交事务
   tran.commit() ;
   // 关闭Session
   this.session.close() ;
   return true;
   }
   catch(HibernateException e)
   {
    return false;
   }
 }
posted @ 2007-12-26 17:31  yiling  阅读(587)  评论(0)    收藏  举报