iteye_17041 2013-03-25 11:16
浏览 275
已采纳

解决一个延迟删除的问题

背景:
比如我要删除Person的一个对象。但是Person关联了其他表。主表,在hibernate中表示为一的一段。
因为数据有关联的,不能删除成功,但不能报错。我分析了执行过程,因为执行了delete方法之后没有马上发出sql语句,不会报出异常,返回了true。当延迟到展示层的时候,才发出sql。

hibernate的工具类。使用filter来管理事务的关闭和开启和session的关闭
[code="java"]
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;
}
[/code]

Action类伪代码
[code="java"]
Person person = hibernate.findPersonById(2);
if(hibernate.delete(person)){
out.print("成功")
}else{
out.print("失败")
}
[/code]
此时,person是有关联的。在数据库工具中直接执行sql会报错。但在这里不会报错。调试的执行过程如下、
在Action中,代用delete方法,进入delete方法,执行session.delete(object),没有发出sql,返回了true。那么action中就执行了 out.print("成功")。然后再出发sql。

以上结果方法是。查询到person。然后判断person是否有关联。然后再决定是否删除。规定不能采用级联
[code="java"]
Set roles =person.getRoles();
if(roles.isEmploy){
if(hibernate.delete(person))
out.print("成功")
else
out.print("失败")
}

[/code]

这并不是一个好的办法可是有的时候在编写的过程中忘记判断是否有关联。
以上的问题怎么解决呢?我想在执行delete的时候,就提示有关联。前提是,使用filter管理事务,不采用jdbc。

  • 写回答

1条回答 默认 最新

  • 征服.刘华强 2013-03-25 11:50
    关注

    解决办法有很多。
    你可以再删除的完毕的时候 手动调用
    [code="java"]
    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;

    [/code]

    第二种可以使用Spring的AOP来管理事务,即把事物控制在某一层,比如把事物控制在
    public boolean delete (Object object) 这个方法所在的层
    这样当delete方法执行完毕以后会自动提交事物.
    然后再结合楼主的filter来关闭session 以确保延迟加载等功能。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型