Hibernate中发生"Session is closed" 的另一种可能!

文章分类:Java编程 关键字: hibernate session is closed

Hibernate中发生"Session is closed" 的另一种可能:没有commit的Transaction。
关键字:"Session is closed" Hibernate
一般的在struts加Hibernate的项目中!大家想必都使用的HibernateUtil和CloseSessionFilter!
也许很多人,只是对上面的两个类只是用一用,大概都没有仔细地研究过吧,我也是一样!

在过渡器中有这样的代码!
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
try{
chain.doFilter((HttpServletRequest)request, (HttpServletResponse)response);
}
finally{
try{
HibernateUtil.commitTransaction();
//System.out.println("commit ok");
}catch (Exception e){
HibernateUtil.rollbackTransaction();
}finally{
HibernateUtil.closeSession();
}  
}
}

在项目开始前一段时期,总觉的每开一个session都要commit一次事务,有些浪费(看不惯"没有作用"的代码)!就这样把它给删了!

在项目开发后运行中,在某个Action中下列代码处
HibernateUtil.beginTransaction()
//省略的代码
//这几句是业务逻辑处理
if(!this.checkYRGS(mcdjForm))
{
Msg.addError(request,new ActionMessage("mcdj.yrgs"));
return mapping.getInputForward();  //这样就有了一个没有commit的Transaction! 这就是问题的根源!
}
//省略的代码
HibernateUtil.commitTransaction();
return mapping.getInputForward("下一个流程页面");

如果有一次在上面的业务逻辑处理处发生了跳转(产生没有commit的Transaction),则下一次运行到
任何处的HibernateUtil.commitTransaction();就会发生异常:Session is closed。!

经过很久的上网搜索和不断的测试(打印相关session和transaction的对象的hashcode),
发现每个不同session的使用session.beginTransaction()获得的transaction对象都是一样的。

总之session.beginTransaction()并不能保证获得的是一个全新transaction对象,也不能保证这个transaction对象与
当前的session进行了关联!

觖决办法:
在filter中commitTransaction(),或在程序中commitTransaction()就行了。一定要保证transaction对象要commit;

Hibernate中发生Session is closed 的另一种可能!相关推荐

  1. Hibernate中发生Session is closed 的另一种可能

    Hibernate中发生"Session is closed" 的另一种可能:没有commit的Transaction. 关键字:"Session is closed&q ...

  2. hibernate中SessionFactory,Session的理解?

    Session接口         Session接口对于Hibernate   开发人员来说是一个最重要的接口.然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会 ...

  3. 一家反欺诈公司的面试经历——3.hibernate中的session的三种状态

    hibernate中的对象有三种状态: 瞬时状态 (Transient),持久状态 (Persistent), 游离状态 1.瞬时状态 (Transient) 由 new 命令开辟内存空间的 Java ...

  4. hibernate中的PO持久化对象及PO三种状态

    一,认识持久化对象PO: 在hibernate的应用程序中,每一个数据库中的表都对应一个持久化对象PO.PO可以看成是与数据库表相映射的java对象.最简单的PO对应数据库中某个表中的一条记录,多个记 ...

  5. Hibernate中封装session(静态单例模式)

    先做一个类,把session封装起来,等用的时候可以直接调用. public class HibernateUtil {//线程锁,保证线程安全,在用的时候只有这一个session,别人无法处理pri ...

  6. Hibernate中的session.beginTransaction();报错解决

    昨天是我第一次跟着书用Hibernate来实现对数据库进行查询.在官网上下载Hibernate的开发工具包并且在myeclipse中搭建好了Hibernate开发环境后就开始编写代码,但是当我在测试类 ...

  7. Hibernate中把Session和线程绑定的配置

    我们一开始用session都用HibernateUtil工具类获得Session对象,因为该工具类可以保证将线程不安全的Session绑定到当前线程内,但每次返回的对象都是一个新的session,我写 ...

  8. java session.load_java – 了解hibernate中的session.get vs session.load方法

    我无法理解load和get之间的区别.当我给session.load时,下面的代码不起作用.它给出了空指针异常.但是当我使用session.get()时,同样有效. public Employee g ...

  9. hibernate中session和sessionFactory的作用

    转载:https://blog.csdn.net/m0_37154839/article/details/79506466 https://www.cnblogs.com/baizhanshi/p/7 ...

最新文章

  1. 构建自己的PHP框架--构建缓存组件(1)
  2. 在微信小程序的JS脚本中使用Promise来优化函数处理
  3. python保存创建文件报错 with open(fileName,‘w‘) as fp: IOError: [Errno 22] invalid mode (‘w‘) or filename
  4. php网页打开输入密码,PHP输入密码查看网页
  5. 20145237第六周学习总结
  6. linux 二级域名设置
  7. 不要给我说什么底层原理_连集合底层实现原理都不知道,你敢说 Redis 用的很溜?...
  8. Oracle序列生成器
  9. pe下bootice修复Linux引导,快启动pe工具之bootice引导修复工具使用教程
  10. 关于transmission下载速度提升的小建议
  11. 2019保定中考计算机时间安排,2019年保定中考考试时间安排,保定中考考试科目时间安排表...
  12. 移动视频通话的过去、现在和未来
  13. 微信小视频显示服务器正在升级,更新微信版本后 朋友圈小视频提示显示录制时间太短的解决办法...
  14. echarts将x轴展示在图标上方
  15. 计算方法/数值分析牛顿下山法C/C++实现方法
  16. d610网络计算机,尼康D610,10年来我见过的真心值得买的全幅单反
  17. Python生成九宫格图片
  18. 【面试/笔试】—— 数学
  19. Java并发编程:可见性、原子性和有序性问题
  20. 最新系统漏洞--git tar.git内存泄露漏洞

热门文章

  1. 帝国cms安装到linux系统,帝国CMS安装方法(适用于 帝国CMS 7.5 )【图文】
  2. DDOS攻防之TCP原理篇之SYN Flood
  3. “Command CodeSign failed with a nonzero exit code”解决方案
  4. c语言中错误c2228,出现异常信息:ERROR C2228,请帮忙看上,多谢
  5. 利用 Python 去除 PDF 水印(和图片水印原理一样)
  6. 李逵和李鬼,求求你,别在MySQL中使用UTF-8了!
  7. TB6600+stm32+42步进电机测试
  8. 用飞秋往服务器传文件,如何使用飞秋FeiQ实现两电脑通信(或传输文件)
  9. 部分选主元 LU 分解,CGETRF in lapack 选主元时调用 ICAMAX
  10. 关于android和软件的开发