您的位置:首页 > 其它

hibernate中一对多的分析

2007-12-26 17:31 218 查看
刚开始学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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: