问题描述
背景:比如我要删除Person的一个对象。但是Person关联了其他表。主表,在hibernate中表示为一的一段。因为数据有关联的,不能删除成功,但不能报错。我分析了执行过程,因为执行了delete方法之后没有马上发出sql语句,不会报出异常,返回了true。当延迟到展示层的时候,才发出sql。hibernate的工具类。使用filter来管理事务的关闭和开启和session的关闭public boolean delete (Object object){boolean result = false;session = getSession();try{session.delete(object);result = true;}catch(Exception e){e.printStackTrace();log.error("HibernateUtil.delete( )", e);return false;}return result;}Action类伪代码Person person = hibernate.findPersonById(2);if(hibernate.delete(person)){ out.print("成功")}else{ out.print("失败")}此时,person是有关联的。在数据库工具中直接执行sql会报错。但在这里不会报错。调试的执行过程如下、在Action中,代用delete方法,进入delete方法,执行session.delete(object),没有发出sql,返回了true。那么action中就执行了 out.print("成功")。然后再出发sql。以上结果方法是。查询到person。然后判断person是否有关联。然后再决定是否删除。规定不能采用级联Set roles =person.getRoles(); if(roles.isEmploy){ if(hibernate.delete(person)) out.print("成功") else out.print("失败")}这并不是一个好的办法可是有的时候在编写的过程中忘记判断是否有关联。以上的问题怎么解决呢?我想在执行delete的时候,就提示有关联。前提是,使用filter管理事务,不采用jdbc。
解决方案
解决办法有很多。你可以再删除的完毕的时候 手动调用boolean result = false; session = getSession(); try{ session.delete(object); session.flush(); //刷新缓存,发出SQL 这样数据库如果有主外键就报异常了 result = true; }catch(Exception e){ e.printStackTrace(); log.error("HibernateUtil.delete( )", e); return false; } return result; 第二种可以使用Spring的AOP来管理事务,即把事物控制在某一层,比如把事物控制在public boolean delete (Object object) 这个方法所在的层这样当delete方法执行完毕以后会自动提交事物.然后再结合楼主的filter来关闭session 以确保延迟加载等功能。