hcr520 2010-09-03 09:15
浏览 337
已采纳

关于hibernate删除数据时出现的异常问题!

各位大侠。小弟最近做个应用,我在页面进行数据删除的时候出了一些问题,希望各位帮忙看看! 

 具体情况:我的应用是基于struts2+spring2.5+hibernate3.2.我的数据库表是通过hibernate生成的,在映射文件上做了相关的关联映射。一个目录表(category),一个文章表(article)。一个目录对应多个文章。我在页面上测试删除目录的时候发现我删除那些还未发布文章的目录可以删除成功,删除已经有文章的目录不成功(意料之内)。奇怪的地方出来了,当我先删除有文章的目录不成功后再去删除无文章的目录便出现了异常,导致不能成功删除。然后我重启tomcat,直接先删除无文章的目录。顺利删除。但只要我先删除已有文章的目录出现异常后再去删除无文章的目录就删除不成功。我想有一个可能解决方案就是对删除关联数据进行一下外键依赖处理。应该就不会出现这种情况。但是我想这应该不是最好的解决办法,因为我发现在第一次出现异常后再进行删除操作时hibernate的session值取不到了。我用的是sessionFactory session   删除方法:session.getCurrentSession().delete(session.getCurrentSession().get(category.class,id)); 
  可能有描述得不清晰的地方,希望各位能看看!谢谢! 
  • 写回答

2条回答 默认 最新

  • cunyan 2010-09-03 09:36
    关注

    Session执行一些sql语句把内存中的对象的状态同步到数据库,这个过程被称为session清理.
    在默认情况下,Session会在下面的时间点清理缓存。
    1 当应用程序调用net.sf.hibernate.Transacation的commit()方法的时候,commit()方法先清理缓存,然后再向数据库提交事务。
    2 当应用程序调用Session的find()或者iterate()时,如果缓存中持久化对象的属性发生了变化,就会先清理缓存,以保证查询结果能反映持久化对象的最新状态。
    3 当应用程序显示调用Session的flush()方法的时候。
    注意Session的commit()和flush()方法的区别。flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务;commit()方法会先调用flush()方法,然

    后提交事务。提交事务意味着对数据库所做的更新被永久保存下来。
    执行session清理的顺序:
    1.按照应用程序调用session.save()方法的衔后顺序,执行所有对实进行插入的insert语句。
    2.执行所有对实体进行更新的update语句。
    3.执行所有对集合进行删除的delete语句。
    4.执行所有对集合元素进行删除、更新或者插入的SQL语句。
    5.执行所有对集合进行插入的insert语句。
    6.按照应用程序调用session.delete()方法的先后顺序,执行所有对实体进行删除的delete语句。
    Session的setFlushMode()方法用于设定清理缓存的时间点。FlushMode类定义了三种不同的清理模式:FlushMode.AUTO、FlushMode.COMMIT和FlushMode.NEVER。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料
  • ¥15 使用R语言marginaleffects包进行边际效应图绘制