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-nosession是一种优化策略,它适合于那些对性能要求较高且不涉及复杂业务逻辑的场景。通过避免频繁打开和关闭Session,可以减少资源消耗,提高系统的响应速度。在实际开发中,我们需要根据项目...
在Hibernate框架中,Session是与数据库交互的主要接口,它负责对象的持久化操作。然而,由于Session不是线程安全的,所以在多线程环境中管理Session就需要特别注意。本篇文章将详细探讨Hibernate中Session的管理,...
hibernate中session对象的状态详解
在Java的持久化框架中,Hibernate是一个非常重要的组件,它为开发者提供了强大的对象关系映射(ORM)功能,使得在Java应用中操作数据库变得更加简单。本文将深入探讨Hibernate中的核心概念——Session管理。 首先,...
`Session`是Hibernate提供的一种与数据库交互的接口,它扮演着应用程序与数据库之间的桥梁角色。与Web开发中的`HttpSession`不同,`Hibernate Session`与JDBC的`Connection`更为相似,负责处理数据的持久化操作。`...
本文将深入探讨Hibernate Session的几种释放模式,以及它们在实际开发中的应用和优缺点。 1. **Transaction边界Session(Transaction Bound Session)** 这是最常见的Session管理方式,通常与Spring的@...
"重写hibernate的session简单增删改查"是一个针对初学者的实践教程,旨在帮助理解如何在Hibernate中自定义Session的操作,以便更好地控制数据库交互。 一、Hibernate Session Hibernate的Session是与数据库交互的...
在Hibernate中,`SessionFactory`是核心组件之一,它是线程安全的,用于创建`Session`对象。`SessionFactory`通常在应用启动时创建一次,然后在整个应用生命周期中复用。创建`SessionFactory`需要通过读取Hibernate...
通过以上介绍,我们可以看到Hibernate Session在数据库操作中的核心地位,正确理解和使用Session是掌握Hibernate的关键。实践中的具体应用需要结合项目需求,灵活运用这些知识,以实现高效、稳定的数据库访问。
Hibernate中获取Session的两种方式代码示例 Hibernate 是一个流行的基于Java的持久层框架,提供了对数据库的访问和操作。Session 是 Hibernate 中一个核心概念,负责管理应用程序与数据库之间的交互。获取 Session ...
在Java的持久化框架中,Hibernate是一个非常重要的存在,它为开发者提供了强大的对象关系映射(ORM)功能,简化了数据库操作。本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个...
Hibernate的Session接口是Java应用程序与Hibernate之间主要的运行时交互接口,它提供了对持久化对象的创建、读取和删除操作。Session的概念是基于对象的状态管理和数据库事务的,它的生命周期通常与一个物理事务绑定...
HQL是Hibernate提供的一种面向对象的查询语言,类似于SQL,但更关注对象而非表格。它允许开发者以类和属性的方式表达查询,极大地提高了代码的可读性和可维护性。HQL支持各种操作,如选择、投影、连接、分组、排序等...
在 Hibernate 中,每个线程都需要一个 Session 对象来与数据库交互。如果未绑定 Session 到线程, Hibernate 将无法正确地执行数据库操作。 解决方案 解决该错误的方法很简单,只需在相应的 manager 实现类中添加 ...
查询数据是Session的另一项重要功能。可以使用`get()`或`load()`方法获取单个对象,`query()`或`createCriteria()`方法创建查询,并通过执行查询获取结果集。例如,使用HQL(Hibernate Query Language)查询: ```...
`Session.flush()`方法是一个关键的操作,它强制Hibernate将内存中的对象状态同步到数据库,确保数据的一致性。这篇博客深入探讨了`Session.flush()`的工作原理和应用场景。 `Session`在Hibernate中主要有以下职责...
其中Hibernate每次都需要手动创建SessionFactory,Session,手动开启提交关闭事务。而这一切操作完全是由Spring来代替。使持久层更加方便,使开发人员减少持久层操作,把注意力放到业务上。
在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它使得开发者可以更加方便地处理数据库操作。本篇文章将探讨如何对Hibernate的`Session`进行简单的包装,以提升代码的可维护性和灵活性。...
- **缓存的同步更新**: 当 Session 清理缓存时,Hibernate 会检查缓存中的对象状态是否发生变化,并同步更新数据库,从而确保数据一致性。 - **缓存相关方法**: - **`flush()`**: 刷新缓存并执行必要的 SQL 语句,...
在Java编程中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本篇将详细讲解如何在Hibernate中手动获取Session,以及涉及到的相关配置和...