级联删除
最近正忙于
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
循环将所有的订单明细表循环出来,再将其删除,最后将订单删除。
以上便是简单的级联删除,只涉及到两个表的级联。
分享到:
相关推荐
基于Springboot的实验报告系统源码数据库文档.zip
GEE训练教程——Landsat5、8和Sentinel-2、DEM和各2哦想指数下载
基于springboot智能健康饮食系统源码数据库文档.zip
基于SpringBoot的校园服务系统源码数据库文档.zip
内容概要: IXIA测试仪的基本配置.doc ixia测试仪基础使用示例.doc IxNetwork如何进行抓包回放-V1.0.pdf IxNetwork如何自定义报文-V2.0.pdf ixia构造ip分片方法.txt IxNetwork使用简介.pdf 适用人群:网络协议造包、打流相关的测试工程技术人员,想要学习的同学可以下载哈 使用场景:构造pcap包,打流 Ixia简介 IXIA使用的是Server-client模式,Server端在测试仪表的主机上,在开机后会随着主机内的操作系统的启动而自动启动,一般情况下不需要人为的手工启动。因此在通常不需要为主机配置专用的显示器和键盘。 client端包括两个测试软件: Ixia Explorer和ScriptMate。这两个软件一般安装在测试用计算机上,在仪表自带的主机中也有这两个软件。根据测试项目的不同来选择使用不同的软件。Ixia Explorer主要提供数据流的测试,针对设备的功能进行测试; ScriptMate提供各种性能测试窗口,针对设备的性能进行测试。 Auto:自动分配;
基于Python+Django花卉商城系统源码数据库文档.zip
Umi-OCR-main.zip
基于微信小程序开发的促销抽奖小工具源码,适用于初学者了解小程序开发过程以及简单抽奖工具的实现。
GEE训练教程——Landsat5、8和Sentinel-2、DEM和各2哦想指数下载
以下是一个关于Spring Boot设计的资源描述及项目源码的简要概述: Spring Boot设计资源描述 Spring Boot是一个为基于Spring的应用提供快速开发工具的框架,其设计旨在简化Spring应用的初始搭建和开发过程。以下是一些关键资源: Spring Boot官方文档:详细阐述了Spring Boot的核心特性、自动配置原理、起步依赖、内嵌式服务器等关键概念。这是学习和掌握Spring Boot设计的首选资源。 在线教程与视频:各大在线教育平台提供了丰富的Spring Boot教程和视频课程,从基础入门到高级应用,帮助开发者全面了解和掌握Spring Boot设计。 书籍与电子资料:许多技术书籍和在线电子资料深入讲解了Spring Boot的设计原理、最佳实践和项目案例,为开发者提供了宝贵的学习资源。 项目源码示例 以下是一个简单的Spring Boot项目源码示例,用于演示Spring Boot的基本结构和自动配置功能: java // 引入Spring Boot依赖 @SpringBootApplication public class MySpri
基于springboot美妆领域管理系统源码数据库文档.zip
tables-3.7.0+gpl-cp37-cp37m-win_amd64.whl
算法是计算机科学的核心,它们在解决各种问题时发挥着关键作用。一个好的算法不仅可以提高程序的效率,还可以简化复杂的问题。下面我将通过一个具体的例子——快速排序算法(Quick Sort)——来展示算法的实现过程,包括资源描述和项目源码。 ### 快速排序算法简介 快速排序是一种高效的排序算法,采用分治法的思想。其基本步骤如下: 1. 从数列中挑出一个元素,称为“基准”(pivot)。 2. 重新排序数列,所有比基准值小的元素放到基准前面,所有比基准值大的元素放到基准后面(相同的数可以到任一边)。在这个分割结束之后,该基准就处于数列的中间位置。这个称为分割(partition)操作。 3. 递归地(recursive)把小于基准值的子数列和大于基准值的子数列排序。 ### 资源描述 快速排序算法因其高效性和简洁性,在实际应用中非常受欢迎。它的时间复杂度平均为 O(n log n),最坏情况下为 O(n^2),但这种情况很少发生。快速排序的空间复杂度为 O(log n),因为它使用了递归来实现。 快速排序的一个典型应用场景是在数据库系统中对大量数据进行排序。由于它的高效性,快速排序
基于springboot农场投入品运营线上管理系统源码数据库文档.zip
基于springboot个性化影院推荐系统源码数据库文档.zip
linux基础进阶笔记,配套视频:https://www.bilibili.com/list/474327672?sid=4493093&spm_id_from=333.999.0.0&desc=1
小程序 微信自动抢红包动态库.zip程序资源学习资料参考
小程序 iOS版微信抢红包插件(支持后台抢红包).zip
经典-FPGA时序约束教程
基于springboot的智慧点餐系统源码数据库文档.zip