`
javachikuang
  • 浏览: 72121 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

HibernateDaoSupport中的getSession()方法

阅读更多
getSession()这个方法本身其实返回的是与当前事务绑定的Session对象,在HibernateDaoSupport中使用,HibernateDaoSupport本身是不负责对这个Session对象进行关闭的,所以在其中有一个对应的releaseSession()方法,用于关闭Session。

但是一般使用Spring时,我们会采用HibernateTransactionManager进行事务管理,把事务配置在Service层。此时,它会帮助我们关闭与当前事务绑定的Session对象,这个可以参照HibernateTransactionManager类中的doCleanupAfterCompletion方法,它是一个抽象方法的实现。再追溯上去,会发现,在事务commit或者rollback的时候,会有一段finally代码,专门调用执行该方法的代码:
finally {   
            cleanupAfterCompletion(status);   
        }   
  
    private void cleanupAfterCompletion(DefaultTransactionStatus status) {   
        status.setCompleted();   
        if (status.isNewSynchronization()) {   
            TransactionSynchronizationManager.clearSynchronization();   
            TransactionSynchronizationManager.setCurrentTransactionName(null);   
            TransactionSynchronizationManager.setCurrentTransactionReadOnly(false);   
            if (status.isNewTransaction()) {   
                TransactionSynchronizationManager.setActualTransactionActive(false);   
            }   
        }   
        if (status.isNewTransaction()) {   
            doCleanupAfterCompletion(status.getTransaction());   
        }   
        if (status.getSuspendedResources() != null) {   
            if (status.isDebug()) {   
                logger.debug("Resuming suspended transaction");   
            }   
            resume(status.getTransaction(), (SuspendedResourcesHolder) status.getSuspendedResources());   
        }   
    }  

故而,只要参与了事务,HibernateTransactionManager会帮你正确关闭Session。

不过很多的web应用都会采用OpenSessionInView模式,也就是Session会被保持到View层。同样经过HibernateTransactionManager,为什么使用了OpenSessionInView模式以后,Session就不会被关闭呢?这是由于在获取当前线程绑定事务的时候,有一个判断,如果存在当前线程绑定的Session,会把当前事务对象的newSessionHolder值设置成false,从而跳过上面的代码中doCleanupAfterCompletion(status.getTransaction());的调用:
protected Object doGetTransaction() {   
        HibernateTransactionObject txObject = new HibernateTransactionObject();   
        txObject.setSavepointAllowed(isNestedTransactionAllowed());   
  
        if (TransactionSynchronizationManager.hasResource(getSessionFactory())) {   
            SessionHolder sessionHolder =   
                    (SessionHolder) TransactionSynchronizationManager.getResource(getSessionFactory());   
            if (logger.isDebugEnabled()) {   
                logger.debug("Found thread-bound Session [" +   
                        SessionFactoryUtils.toString(sessionHolder.getSession()) + "] for Hibernate transaction");   
            }   
            txObject.setSessionHolder(sessionHolder, false);   
            if (getDataSource() != null) {   
                ConnectionHolder conHolder = (ConnectionHolder)   
                        TransactionSynchronizationManager.getResource(getDataSource());   
                txObject.setConnectionHolder(conHolder);   
            }   
        }   
  
        return txObject;   
    }  

综合一下,只要使用Spring的TransactionManager来管理事务,就可以放心在HibernateDaoSupport中使用getSession(),释放的工作会有Spring帮你完成。
分享到:
评论
1 楼 daquan198163 2012-06-04  
如果有一天你的service被别人拿去复用,而且没有配置AOP事务和OpenSessionInView,就会出问题了。

相关推荐

    HibernateDaoSupport 与@Autowired

    在Java开发领域,尤其是Spring框架的应用中,`HibernateDaoSupport`和`@Autowired`是两个非常重要的概念。它们分别代表了Hibernate对DAO层的支持以及Spring框架的依赖注入机制。接下来,我们将深入探讨这两个知识点...

    hibernateDaoSupport类的运用实例

    本文将详细介绍`hibernateDaoSupport`的使用方法,并通过一个具体的示例来说明其在项目中的应用。 #### 二、`hibernateDaoSupport`类的核心功能 `hibernateDaoSupport`类提供了以下几个核心功能: 1. **...

    HibernateDaoSupport二次封装组件,快速统计和查询,修改

    本文将深入探讨`HibernateDaoSupport`的二次封装,以及如何通过封装来实现快速的统计、查询、修改和删除操作,同时也会涉及SQL语句中的`in`、`or`和`exists`子句的应用。 首先,`HibernateDaoSupport`提供了对`...

    HibernateTemplate及generator用法.doc

    当我们在DAO中继承`HibernateDaoSupport`时,可以通过以下两种方式使用Hibernate: 1. 直接调用`super.getSession()`获取Session并进行操作,如`getSession().find()`等。 2. 使用`getHibernateTemplate()`,然后...

    HibernateTemplate及generator用法.docx

    原因是`getSession()`会在每个操作时创建新的Session,如果在一个线程中有大量的并发操作,这可能导致数据库连接数过多,超出数据库允许的最大连接数,从而引发性能问题。而`getHibernateTemplate()`则能更好地管理...

    springboot集成hibernate

    `getSession()`方法获取当前Session,`beginTransaction()`和`commit()`分别用于开始和提交事务,而`save()`方法用于保存实体到数据库。 最后,我们可以在Service或Controller中注入UserDAO,调用其方法来实现业务...

    JSP 开发之 releaseSession的实例详解

    在Spring框架中,`getSession()`是`org.springframework.orm.hibernate3.support.HibernateDaoSupport`类提供的一个方法,它可以在当前事务中获取或开启一个新的Hibernate Session。然而,仅仅在每次查询后调用`...

    Hibernate分页封装

    在上面的示例代码中,我们还可以看到,分页算法主要通过countSize()和countPage()方法来实现。countSize()方法用于计算总记录数,而countPage()方法用于计算总页数。这些方法都是通过Criteria API来实现的。 5. ...

    getHibernateTemplate分页-模糊查询

    public class InfoDAOImpl extends HibernateDaoSupport implements IInfoDAO { public void setInfo(Info info) throws Exception { getHibernateTemplate().save(info); } public Info getInfoById(String ...

    ssh开源框架日志心得.pdf

    在DAO实现中,可以继承`HibernateDaoSupport`,并通过`setSessionFactory`方法注入`SessionFactory`,以获得对`HibernateTemplate`的访问,从而执行HQL查询和CRUD操作。 8. **数据访问异常处理**: `getSession()`...

    Struts spring hibernate整合

    为了进行数据库操作,通常会创建一个继承自`HibernateDaoSupport`的DAO类,这样可以直接使用`getSession()`方法进行操作。例如: ```java public class Dao extends HibernateDaoSupport { public List selectList...

    SSH整合学习笔记之spring与hibernate整合(二)之c3p0

    然后,我们可以通过`getSession()`方法获取到当前的Session对象,执行CRUD操作。 通过这样的整合,Spring负责管理事务和对象生命周期,而Hibernate负责数据库操作,c3p0则在二者之间提供高效的数据源管理,形成一个...

    getHibernateTemplate

    `getHibernateTemplate()`方法是Spring框架中用于整合Hibernate ORM的一个关键接口,它是`HibernateDaoSupport`类的一个重要方法。在Spring MVC(S2SH,即Struts2、Spring和Hibernate的组合)架构中,`...

    Struts+Spring+Hibernate配置手册

    DAO层的实现需继承Spring提供的`HibernateDaoSupport`,它提供了方便的`getSession()`方法,可以直接访问Hibernate的Session,简化了数据操作。至此,SSH框架的集成已经完成,可以进行业务逻辑的开发和测试。 总的...

    Spring+Hibernate整合

    - **HibernateDAOSupport**:继承此类可以自动获得SessionFactory,通过getSession()方法获取Session。 - **HibernateTemplate**:提供了一系列的方法来执行CRUD(Create, Read, Update, Delete)操作,以及查询、...

    j2ee中struts+hibernate+spring+pager-taglib分页实例

    在UserDaoImpl类中,通过继承HibernateDaoSupport并实现UserDao接口,完成具体的数据库操作。 ```java public class UserDaoImpl extends HibernateDaoSupport implements UserDao { public void addUser(User ...

    Flex+J2EE实例(cairngorm+blazeDS+hibernate+spring) part3.pdf

    其中一个重要的文件是`HibernateDao.java`,该文件提供了一组通用的数据库操作方法,如下所示: ```java package com.core.hibernate; import java.io.Serializable; import java.util.List; import org....

    hibernate+spring实现分页

    - **说明**: 在该类中实现了 `PaginateInterface` 的方法,并利用Hibernate和Spring进行具体的数据库操作。 #### 五、关键代码解析 1. **计算总页数**: ```java if (pageSize != 0) { pageCount = count / ...

    使用pager-taglib实现分页显示的详细步骤

    使用Hibernate实现`UserDao`接口中的方法。其中,`findAllUser`方法是核心,它负责执行SQL查询并返回分页后的数据。 ```java public class UserDaoImpl extends HibernateDaoSupport implements UserDao { @...

    整合Struts+Spring+Hibernate简单例子开发.pdf

    - 新建项目`login`,具体步骤参考文档中的“Struts+Spring+Hibernate之搭建Eclipse + MyEclipse开发环境”部分。 - 项目结构示例: - `src/` - `com.lnic/` - `dao/` - `UserDao.java` - `UserDaoImpl.java` -...

Global site tag (gtag.js) - Google Analytics