级联删除
最近正忙于
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
循环将所有的订单明细表循环出来,再将其删除,最后将订单删除。
以上便是简单的级联删除,只涉及到两个表的级联。
分享到:
相关推荐
SH367309级联_26S_同口_采集模式_V3.0
SH367309级联_26S_同口_保护模式_V3.0
如果,现在有两张表A(id,xx.xx...),C(id,Cid,xx,xx...),预实现C中的id与A 中id级联删除、级联更新/数据同步,可有两种实现方式: 一. 利用sql server自带的级联删除、级联更新功能,即其外键约束途径 alter table ...
hibernate many-to-many级联保存,级联更新,级联删除
hibernate分页,多项查询,多表级联,菜鸟学习之用
mysql级联更新和级联删除,区分有级联和没级联操作的区别之处
SQL server创建触发器实现级联删除
qt下的sqlite3实现级联删除,在vs2010 + qt5.40 + win7下编译通过
三表级联,模糊查询,s2sh框架整合,hibernate分页,菜鸟学习之用
MSserver自关联表的级联删除,使用触发器对自关联树形结构的表进行级联删除,文有几点教训,有编写脚本的初衷。
联系通过写存储过程进行级联删除,在实际开发中总结的
在数据库MySQL中利用外键实现级联删除、更新等方面的内容。有兴趣可以看看。。
有学院表(id,name)、学生表(id,schid,stuname)。当删除学院时,该学院下的学生自动删除。当更新学院时,学生表自动更新。
级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单
级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单...
菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联菜单级联
JSP级联效果JSP级联效果JSP级联效果JSP级联效果JSP级联效果JSP级联效果JSP级联效果JSP级联效果JSP级联效果JSP级联效果
iBATIS 级联iBATIS 级联iBATIS 级联
SH367309_16S_同口_保护模式_V1.3
SH367309+SH79F6441_DemoCode_V3.1_191108.zip