1、在我们删除组的时候,如果组中有user, 就无法删除
/**
* 由于Group, 和User关联, 如果组中有User, 就不能够删除
*/
public void delete(int gid) {
if (userHibernateDao.getGroupUserCount(gid) >0) {
throw new UserException("用户组中有关联用户");
}
groupHibernateDao.delete(gid);
}
2、现在如果先将组中成员先删除, 然后再删除组,
2.1、删除组中用户
2.1.1、遍历组中成员 list(), 一个个删除delete(u.getId) 这种方法效率低,有多少个user, 就需要多少个sql
2.1.2、Hibernate提供一种DML操作, 能够提供批量处理 UserHibernateDao中
@Override
public void delteByGroup(int gid) {
String hql = "delete from User u where u.group.id = :gid";
//bulk delete
this.getSession().createQuery(hql).setParameter("gid", gid).executeUpdate();
}
2.2 GroupService的delete(int gid)
/**
* 由于Group, 和User关联, 如果组中有User, 就不能够删除
*/
public void delete(int gid) {
//先删除组中用户
userHibernateDao.delteByGroup(gid);
//在删除组
groupHibernateDao.delete(gid);
}
2.3、在GroupAction中创建delete()
/**
* 删除组操作
* @return
*/
public String delete() {
groupService.delete(group.getId());
//设置跳转的url
ActionContext.getContext().put("url", "/group_list.action");
//删除时候重新调到展示, 客户端跳转
return "redirect";
}
3、声明式事务
如果在上面删除组中用户和删除组的中间出现异常, 会导致事务不完整, 导致数的不完整
/**
* 由于Group, 和User关联, 如果组中有User, 就不能够删除
*/
public void delete(int gid) {
userHibernateDao.delteByGroup(gid);
//设置测试异常
if (userHibernateDao.getGroupUserCount(gid) >0) {
throw new UserException("用户组中有关联用户");
}
groupHibernateDao.delete(gid);
}
结果: 用户删除了, 组没有删除,导致数据的不完整性,应该在一个事务中执行,如果放在Dao中操作, 导致Dao的不干净,
3.1、Spring提供了声明式事务,
3.1.1、我们现在的事务是声明在Dao
3.1.2、通常我们会在Service中来处理多个业务对象逻辑的关系, 注入删除,更新等, 如果在执行一个步骤抛出异常就会导致数据不完整, 所以事务不应该在Dao层处理, 而是在Service, 这是Spring所提供的一个非常方便的工作, 声明式事务
3.1.3、为了提高效率,可以将一些查询类的事务设置为只读事务