级联删除
最近正忙于 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 循环将所有的订单明细表循环出来,再将其删除,最后将订单删除。
以上便是简单的级联删除,只涉及到两个表的级联。