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;
}
}
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;
}
}