在用spring管理hierbernate的事务我们一般都用TransactionProxyFactoryBean去配置我们的Service方法.
如.
<bean id="baseTxProxy" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="is*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- <bean id="userManager" parent="baseTxProxy">
<property name="target">
<bean class="com.javaeye.user.impl.hibernate.UserManagerImpl" >
<property name="cacheQueries"><value>true</value></property>
</bean>
</property>
</bean>
-->
<bean id="userService" parent="baseTxProxy">
<property name="target">
<bean class="com.dengyin.report.service.impl.UserServiceImpl" />
</property>
</bean>
<bean id="dailyReportService" parent="baseTxProxy">
<property name="target">
<bean class="com.dengyin.report.service.impl.DailyReportServiceImpl" />
</property>
</bean>
我们可以想得到TransactionProxyFactoryBean是使用aop在Service方法之前open 一个session, begin Trans.在Service结束之后Commit Trans, close session.
但是我们使用spring的OpenSessionInViewFilter的时候就不能在Service方法后close session了. 应该是在Render page之后再关闭session的.所以我跟踪了spring的代码. 最后发现了spring是怎样做的.
HibernateTransactionObject txObject = (HibernateTransactionObject) transaction;
if (txObject.getSessionHolder() == null) {
Interceptor entityInterceptor = getEntityInterceptor();
Session newSession = (entityInterceptor != null ?
getSessionFactory().openSession(entityInterceptor) : getSessionFactory().openSession());
if (logger.isDebugEnabled()) {
logger.debug("Opened new Session [" + newSession + "] for Hibernate transaction");
}
txObject.setSessionHolder(new SessionHolder(newSession), true);
}
txObject.getSessionHolder().setSynchronizedWithTransaction(true);
session = txObject.getSessionHolder().getSession();
这段代码是在进行Service之前的. 如果当前thread没有session的话就执行txObject.setSessionHolder(new SessionHolder(newSession), true);注意这里set了一个true值. 我们来看看txObject是一个什么东西.
private static class HibernateTransactionObject extends JdbcTransactionObjectSupport {
private SessionHolder sessionHolder;
private boolean newSessionHolder;
public void setSessionHolder(SessionHolder sessionHolder, boolean newSessionHolder) {
this.sessionHolder = sessionHolder;
this.newSessionHolder = newSessionHolder;
}
public SessionHolder getSessionHolder() {
return sessionHolder;
}
public boolean isNewSessionHolder() {
return newSessionHolder;
}
public boolean hasTransaction() {
return (this.sessionHolder != null && this.sessionHolder.getTransaction() != null);
}
public void setRollbackOnly() {
getSessionHolder().setRollbackOnly();
if (getConnectionHolder() != null) {
getConnectionHolder().setRollbackOnly();
}
}
public boolean isRollbackOnly() {
return getSessionHolder().isRollbackOnly() ||
(getConnectionHolder() != null && getConnectionHolder().isRollbackOnly());
}
}
我们看看Service方法之后spring怎样close session的.
Session session = txObject.getSessionHolder().getSession();
if (txObject.isNewSessionHolder()) {
if (logger.isDebugEnabled()) {
logger.debug("Closing Hibernate Session [" + session + "] after transaction");
}
SessionFactoryUtils.releaseSession(session, getSessionFactory());
}
else {
if (logger.isDebugEnabled()) {
logger.debug("Not closing pre-bound Hibernate Session [" + session + "] after transaction");
}
if (txObject.getSessionHolder().getPreviousFlushMode() != null) {
session.setFlushMode(txObject.getSessionHolder().getPreviousFlushMode());
}
}
txObject.getSessionHolder().clear();
当txObject.isNewSessionHolder()的时候才会close session.
总结:
所以当Service方法之间没有存在的session时spring会开一session,然后结束的时候close session.
当Service方法之间有存在的session的话,Service方法结束时并没有关闭 session.
相关推荐
在Spring中,我们通常使用`LocalSessionFactoryBean`来创建Hibernate的SessionFactory,并通过`HibernateTemplate`或`SessionFactory`接口进行数据访问操作。`SessionFactory`是一个线程安全的工厂,用于创建`...
Spring MVC、Spring 和 Hibernate 是Java Web开发中的三大主流框架,它们各司其职,共同构建了一个强大而灵活的后端架构。Spring MVC 负责处理HTTP请求并将其路由到相应的控制器,Spring 提供了依赖注入(DI)和面向...
在本教程中,我们将深入探讨如何使用Spring MVC、Spring和Hibernate三大框架进行全注解的整合开发。这个视频教程系列的第12部分,将帮助开发者掌握如何在Java Web项目中高效地集成这三个核心框架,实现松耦合、可...
同时,你还需要配置一个Hibernate的本地SessionFactory Bean,以便Spring能够管理和控制Hibernate的生命周期。 总的来说,这个入门实例旨在帮助初学者理解如何在没有使用注解的情况下,通过XML配置文件集成...
在 Spring 中使用 Hibernate 通常有两种方式:一是使用 HibernateTemplate 或 HibernateDaoSupport,另一种是直接使用 Hibernate 的原生 API。这里我们关注后者,通过 Spring 注入 SessionFactory 到 DAO 类中,然后...
1. **依赖注入**:Spring 提供的 DI(Dependency Injection)机制可以帮助管理 Hibernate SessionFactory 和 Session 实例,避免手动创建和管理这些对象。在配置文件中定义 SessionFactory 的 Bean,然后通过注解或 ...
Struts2、Spring和Hibernate是Java开发中三大主流的开源框架,它们分别专注于Web层、业务层和服务层的管理,组合使用可以构建出强大的企业级应用。这些框架的jar包是开发人员日常工作中必不可少的工具。 **Struts2*...
本文将详细探讨Spring与Hibernate的集成,特别是如何在集成环境中使用和管理`Session`。 首先,Spring作为一个轻量级的框架,提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,它可以帮助我们解耦应用程序...
这是最常见的Session管理方式,通常与Spring的@Transactional注解结合使用。每个数据库事务开始时创建Session,事务结束时关闭Session。这种方式简单且易于理解,能保证事务的ACID特性,但可能会导致大量的短连接,...
其次,Spring的ApplicationContext可以加载Hibernate的相关配置,如SessionFactory,进而创建Session对象,进行数据库操作。同时,Spring还可以通过Bean工厂来管理Hibernate的实体类,实现数据持久化。 在配置上,...
然而,在使用 Hibernate 进行数据库操作时,经常会遇到 "No Hibernate Session bound to thread" 的错误信息。本文将详细介绍该错误的解决方案。 错误原因 "No Hibernate Session bound to thread" 错误信息通常是...
- **创建DAO接口和实现**:设计DAO接口,然后用Hibernate的Session作为基础实现数据操作方法。 - **使用HibernateTemplate**:Spring提供了一个`HibernateTemplate`类,简化了对Session的操作,可以减少代码量和...
这个示例代码可能包含了一个简单的SSH项目,展示了如何配置Spring的IoC(Inversion of Control,控制反转)容器来管理Hibernate的Session,以及如何在业务逻辑层和数据访问层之间建立联系。 "示例代码"意味着我们将...
2. **SessionFactory和Session的管理**:Spring提供了一个HibernateTemplate或HibernateDaoSupport类,帮助我们管理SessionFactory和Session,使得在Spring环境下使用Hibernate变得更加方便。这些类会自动处理...
这种整合能够充分利用Spring的管理能力,对Hibernate进行配置和控制,同时利用Spring的数据访问支持,如JdbcTemplate或HibernateTemplate,来简化数据操作。 在整合过程中,首先需要配置Spring的ApplicationContext...
标题"Spring整合Hibernate.jar"意味着我们将讨论如何将这两个强大的框架集成在一起,以便在Spring管理的环境中使用Hibernate进行数据库操作。这通常涉及到以下步骤和知识点: 1. **引入依赖**:首先,你需要在项目...
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(hibernateSession)); ``` 然后,在类中加入以下两个私有函数: ```java private SessionFactory lookupSessionFactory...
在 Spring 和 Hibernate 集成中,c3p0 可以作为数据源配置,用于管理数据库连接,避免频繁创建和关闭连接带来的性能开销。 在实际应用中,开发者通常会使用 Spring 的 `LocalSessionFactoryBean` 来配置 Hibernate ...
在实现类中,我们可以使用Hibernate的Session来执行CRUD操作: ```java import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; ...
Spring是一个全面的Java应用框架,提供依赖注入、AOP(面向切面编程)、MVC(模型-视图-控制器)等特性,而Hibernate是一个ORM(对象关系映射)框架,用于简化数据库操作。当我们谈论"spring_hibernate整合实例"时,...