当前位置: 代码迷 >> Web前端 >> S2SH调整级联删除
  详细解决方案

S2SH调整级联删除

热度:188   发布时间:2012-10-06 17:34:01.0
S2SH整合级联删除

?

级联删除

最近正忙于 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 循环将所有的订单明细表循环出来,再将其删除,最后将订单删除。

以上便是简单的级联删除,只涉及到两个表的级联。

?

  相关解决方案