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帮你完成。
分享到:
相关推荐
在Java开发领域,尤其是Spring框架的应用中,`HibernateDaoSupport`和`@Autowired`是两个非常重要的概念。它们分别代表了Hibernate对DAO层的支持以及Spring框架的依赖注入机制。接下来,我们将深入探讨这两个知识点...
本文将详细介绍`hibernateDaoSupport`的使用方法,并通过一个具体的示例来说明其在项目中的应用。 #### 二、`hibernateDaoSupport`类的核心功能 `hibernateDaoSupport`类提供了以下几个核心功能: 1. **...
本文将深入探讨`HibernateDaoSupport`的二次封装,以及如何通过封装来实现快速的统计、查询、修改和删除操作,同时也会涉及SQL语句中的`in`、`or`和`exists`子句的应用。 首先,`HibernateDaoSupport`提供了对`...
当我们在DAO中继承`HibernateDaoSupport`时,可以通过以下两种方式使用Hibernate: 1. 直接调用`super.getSession()`获取Session并进行操作,如`getSession().find()`等。 2. 使用`getHibernateTemplate()`,然后...
原因是`getSession()`会在每个操作时创建新的Session,如果在一个线程中有大量的并发操作,这可能导致数据库连接数过多,超出数据库允许的最大连接数,从而引发性能问题。而`getHibernateTemplate()`则能更好地管理...
`getSession()`方法获取当前Session,`beginTransaction()`和`commit()`分别用于开始和提交事务,而`save()`方法用于保存实体到数据库。 最后,我们可以在Service或Controller中注入UserDAO,调用其方法来实现业务...
在Spring框架中,`getSession()`是`org.springframework.orm.hibernate3.support.HibernateDaoSupport`类提供的一个方法,它可以在当前事务中获取或开启一个新的Hibernate Session。然而,仅仅在每次查询后调用`...
在上面的示例代码中,我们还可以看到,分页算法主要通过countSize()和countPage()方法来实现。countSize()方法用于计算总记录数,而countPage()方法用于计算总页数。这些方法都是通过Criteria API来实现的。 5. ...
public class InfoDAOImpl extends HibernateDaoSupport implements IInfoDAO { public void setInfo(Info info) throws Exception { getHibernateTemplate().save(info); } public Info getInfoById(String ...
在DAO实现中,可以继承`HibernateDaoSupport`,并通过`setSessionFactory`方法注入`SessionFactory`,以获得对`HibernateTemplate`的访问,从而执行HQL查询和CRUD操作。 8. **数据访问异常处理**: `getSession()`...
为了进行数据库操作,通常会创建一个继承自`HibernateDaoSupport`的DAO类,这样可以直接使用`getSession()`方法进行操作。例如: ```java public class Dao extends HibernateDaoSupport { public List selectList...
然后,我们可以通过`getSession()`方法获取到当前的Session对象,执行CRUD操作。 通过这样的整合,Spring负责管理事务和对象生命周期,而Hibernate负责数据库操作,c3p0则在二者之间提供高效的数据源管理,形成一个...
`getHibernateTemplate()`方法是Spring框架中用于整合Hibernate ORM的一个关键接口,它是`HibernateDaoSupport`类的一个重要方法。在Spring MVC(S2SH,即Struts2、Spring和Hibernate的组合)架构中,`...
DAO层的实现需继承Spring提供的`HibernateDaoSupport`,它提供了方便的`getSession()`方法,可以直接访问Hibernate的Session,简化了数据操作。至此,SSH框架的集成已经完成,可以进行业务逻辑的开发和测试。 总的...
- **HibernateDAOSupport**:继承此类可以自动获得SessionFactory,通过getSession()方法获取Session。 - **HibernateTemplate**:提供了一系列的方法来执行CRUD(Create, Read, Update, Delete)操作,以及查询、...
在UserDaoImpl类中,通过继承HibernateDaoSupport并实现UserDao接口,完成具体的数据库操作。 ```java public class UserDaoImpl extends HibernateDaoSupport implements UserDao { public void addUser(User ...
其中一个重要的文件是`HibernateDao.java`,该文件提供了一组通用的数据库操作方法,如下所示: ```java package com.core.hibernate; import java.io.Serializable; import java.util.List; import org....
- **说明**: 在该类中实现了 `PaginateInterface` 的方法,并利用Hibernate和Spring进行具体的数据库操作。 #### 五、关键代码解析 1. **计算总页数**: ```java if (pageSize != 0) { pageCount = count / ...
使用Hibernate实现`UserDao`接口中的方法。其中,`findAllUser`方法是核心,它负责执行SQL查询并返回分页后的数据。 ```java public class UserDaoImpl extends HibernateDaoSupport implements UserDao { @...
- 新建项目`login`,具体步骤参考文档中的“Struts+Spring+Hibernate之搭建Eclipse + MyEclipse开发环境”部分。 - 项目结构示例: - `src/` - `com.lnic/` - `dao/` - `UserDao.java` - `UserDaoImpl.java` -...