级联删除
最近正忙于 s2sh 项目的后台功能的实现,后台功能已基本实现,今天周末,闲来无事,给大家晒晒我写的级联删除,在写之前就被这四个字吓到了,还以为有多难,实现之后才知道也不过如此,也许还有更难的级联删除操作,不过暂时我还没有遇到 .
我喜欢用实例来阐述,这样说的明白,又容易理解。以订单为例我们来实现级联删除,首先我们先分析一下各个表之间的关系。、
Orders( 订单表 ) 的字段如下:
payments,employees,customers,number,rdate,sum,sendmode,status,orderdetails
订单表中包含订单的支付方式 (payments) ,管理订单的员工 (employees) ,下订单的客户 (customers) 以及与与订单关联的订单明细表 (orderdetails) 。其中订单与订单明细表之间是 1 : n 的关联关系。
分析实现后的结果:
若要删除一个订单,则与之关联的订单明细表需要删除。
首先在 domain 中生成各个字段的 set(),get() 方法,以及无参的构造方法,带参数的构造方法。
Domain 中代码如下:
public class Orders implements java.io.Serializable {
/**
* @author DXL_xiaoli
*/
private static final long serialVersionUID = 1L;
//递增序列
private Integer id;
//支付方式
private Payments payments;
//员工
private Employees employees;
//客户
private Customers customers;
//订单编号
private String number;
//订单日期
private Date rdate;
//订单金额
private Double sum;
//送货方式
private String sendmode;
//订单状态
private String status;
private Set<Orderdetails> orderdetailses = new HashSet<Orderdetails>(0);
//生成set(),get(),public Orders(),public Orders(….)方法
}
当我们点击删除时需要将其所对应的 id 传到 action 中并通过其配置文件找到 action 中的 delet() 方法, action 中的代码如下:
public class OrdersAction extends ActionSupport {
/**
* @author DXL_xiaoli
*/
private static final long serialVersionUID = 1L;
private OrdersServiceImpl ordersServiceImpl;
private Orders entity;
//构造器注入
public void setOrdersServiceImpl(OrdersServiceImpl ordersServiceImpl) {
this.ordersServiceImpl = ordersServiceImpl;
}
public Orders getEntity() {
return entity;
}
public void setEntity(Orders entity) {
this.entity = entity;
}
//删除方法
public String delete() {
ordersServiceImpl.delete(entity.getId());
return "delete";
}
}
执行到这里不难发现代码量极其简洁,下面将要到 service 层中执行删除 service 层代码如下:
public class OrdersServiceImpl implements OrdersService{
private OrdersDaoImpl ordersDaoImpl;
public void setOrdersDaoImpl(OrdersDaoImpl ordersDaoImpl) {
this.ordersDaoImpl = ordersDaoImpl;
}
public void delete(Integer id) {
ordersDaoImpl.delete(id);
}
}
根据从页面获取的 id 将实体删除,一下就是真正的底层实现类 dao , dao 中的方法如下:
public class OrdersDaoImpl extends HibernateDaoSupport implements OrdersDao {
public void delete(Integer id) {
this.delete(findById(id));
}
public Orders findById(Integer id) {
return (Orders) this.getHibernateTemplate().get(Orders.class, id);
}
//级联删除实现
public void delete(Orders entity) {
Set<Orderdetails> orderdetails = entity.getOrderdetailses();
if (orderdetails == null) {
} else {
for (Orderdetails orderdetail : orderdetails) {
this.getHibernateTemplate().delete(orderdetail);
}
}
this.getHibernateTemplate().delete(entity);
}
}
以上代码中执行的方法先后是:先执行 delete(Integer id) 再执行 findById(Integer id) 方法,最后执行 delete(Orders entity) 方法。意思是先根据从页面获取来的 id 将所要删除的实体查询出来,然后再根据 id 将其所对应的实体删除。
由于订单表与订单明细表有所关联,所以在删除订单表时先将其所对应的订单明细表删除。一个订单对应多个订单明细表,所以用 for 循环将所有的订单明细表循环出来,再将其删除,最后将订单删除。
以上便是简单的级联删除,只涉及到两个表的级联。