`

Spring4+Hibernate4+测试驱动开发时发现的问题:No session (下)

 
阅读更多

昨天发现的问题今天又看了一下,Hibernate的SessionFactory接口的实现类是SessionFactoryImpl。它在创建Session时候的工作原理如下:

 

 

当调用SessionFactory.getCurrentSession的时候,它会调用CurrentSessionContext接口子类实例的currentSession()方法来获得Session,那CurrentSessionContext子类实例是怎么创建的呢?

SpringFactoryImpl会根据配置文件制定的"hibernate.current_session_context_class"这个配置项来决定实例化哪种CurrentSessionContext的子类实例。SessionFactoryImpl会通过先调用buildCurrentSessionContext()方法加载session管理的策略,然后生成对应策略的CurrentSessionContext子类实例以供SessionFactoryImpl使用。

 

以下是buildCurrentSessionContext()方法的代码:

private CurrentSessionContext buildCurrentSessionContext() {
		String impl = properties.getProperty( Environment.CURRENT_SESSION_CONTEXT_CLASS );
		// for backward-compatibility
		if ( impl == null ) {
			if ( canAccessTransactionManager() ) {
				impl = "jta";
			}
			else {
				return null;
			}
		}

		if ( "jta".equals( impl ) ) {
			if ( ! transactionFactory().compatibleWithJtaSynchronization() ) {
				LOG.autoFlushWillNotWork();
			}
			return new JTASessionContext( this );
		}
		else if ( "thread".equals( impl ) ) {
			return new ThreadLocalSessionContext( this );
		}
		else if ( "managed".equals( impl ) ) {
			return new ManagedSessionContext( this );
		}
		else {
			try {
				Class implClass = serviceRegistry.getService( ClassLoaderService.class ).classForName( impl );
				return ( CurrentSessionContext ) implClass
						.getConstructor( new Class[] { SessionFactoryImplementor.class } )
						.newInstance( this );
			}
			catch( Throwable t ) {
				LOG.unableToConstructCurrentSessionContext( impl, t );
				return null;
			}
		}
	}

 在我上一篇博客提到,我没有设置任何hibernate.current_session_context_class的配置,这个时候为什么没报异常呢?通过Debug它的代码,发现Spring4在默认情况下会设org.springframework.orm.hibernate4.SpringSessionContext这个值作为hibernate.current_session_context_class属性的值,也就是说在默认情况下,SpringSessionContext作为Spring4-orm的Session生成策略类。

再看以下SpringSessionContext的currentSession()方法,代码如下:

public Session currentSession() throws HibernateException {
		Object value = TransactionSynchronizationManager.getResource(this.sessionFactory);
		if (value instanceof Session) {
			return (Session) value;
		}
		else if (value instanceof SessionHolder) {
			SessionHolder sessionHolder = (SessionHolder) value;
			Session session = sessionHolder.getSession();
			if (TransactionSynchronizationManager.isSynchronizationActive() &&
					!sessionHolder.isSynchronizedWithTransaction()) {
				TransactionSynchronizationManager.registerSynchronization(
						new SpringSessionSynchronization(sessionHolder, this.sessionFactory));
				sessionHolder.setSynchronizedWithTransaction(true);
				// Switch to FlushMode.AUTO, as we have to assume a thread-bound Session
				// with FlushMode.MANUAL, which needs to allow flushing within the transaction.
				FlushMode flushMode = session.getFlushMode();
				if (flushMode.equals(FlushMode.MANUAL) &&
						!TransactionSynchronizationManager.isCurrentTransactionReadOnly()) {
					session.setFlushMode(FlushMode.AUTO);
					sessionHolder.setPreviousFlushMode(flushMode);
				}
			}
			return session;
		}
		else if (this.jtaSessionContext != null) {
			Session session = this.jtaSessionContext.currentSession();
			if (TransactionSynchronizationManager.isSynchronizationActive()) {
				TransactionSynchronizationManager.registerSynchronization(new SpringFlushSynchronization(session));
			}
			return session;
		}
		else {
			throw new HibernateException("No Session found for current thread");
		}
	}

 如果我们没有配置事务, 

Object value = TransactionSynchronizationManager.getResource(this.sessionFactory);    

这个值会是null,问题就出在这里。

 

 

 

分享到:
评论

相关推荐

    springmvc+spring+hibernate

    Spring MVC、Spring 和 Hibernate 是Java Web开发中的三大主流框架,它们各司其职,共同构建了一个强大而灵活的后端架构。Spring MVC 负责处理HTTP请求并将其路由到相应的控制器,Spring 提供了依赖注入(DI)和面向...

    spring+hibernate整合实现简单数据库添加记录

    在与Hibernate整合时,我们通常会使用HibernateTransactionManager,它基于Hibernate的Session管理事务。 3. **实体类和映射文件**:定义Java实体类,这些类代表数据库中的表。每个实体类通常对应一个Hibernate的....

    在Netbeans中使用Struts2.0+Spring2.5+Hibernate框架

    本文旨在通过一个简单的登录示例项目,详细介绍如何在Netbeans IDE环境下构建基于Struts2.0、Spring2.5与Hibernate框架的应用程序。 #### 二、环境搭建与准备 ##### 1. 软件需求 - JDK 1.6:确保安装了正确的Java...

    springMVC4+Hibernate4整合例子

    SpringMVC4与Hibernate4是两个非常重要的Java Web开发框架,它们在企业级应用中广泛使用。SpringMVC作为Spring框架的一部分,负责处理HTTP请求,而Hibernate则是一个强大的对象关系映射(ORM)框架,用于简化数据库...

    Strus2+Spring 4 +Hibernate 所需全部jar包

    2. Spring 4:Spring是一个全面的企业级应用开发框架,它涵盖了依赖注入(DI)、面向切面编程(AOP)、数据访问/集成、Web应用、测试、事务管理等多个方面。Spring4在Spring3的基础上进行了优化,支持Java 8的新特性...

    ZK+spring+hibernate的整合

    4. **配置ZK-Spring**:需要引入ZK-Spring的库,这是一个连接ZK和Spring的桥梁,它提供了Spring的ApplicationContext到ZK Session的绑定,使得ZK组件可以直接使用Spring的Bean。 5. **事务管理**:由于Spring对事务...

    spring+springMVC+Hibernate整合

    在IT行业中,Spring、SpringMVC和Hibernate是三个非常重要的框架,它们分别专注于不同领域的功能。Spring是一个全面的Java企业级应用开发框架,提供依赖注入(DI)和面向切面编程(AOP)等核心特性;SpringMVC是...

    Spring+Hibernate+MySql的应用实例

    4. **pom.xml**:Maven的项目对象模型,定义了项目的依赖管理,包括Spring、Hibernate和MySQL驱动等。 **运行与测试**:开发者需要确保所有依赖已正确添加,并根据实际环境调整配置文件中的数据库连接信息。运行...

    Struts2+Spring2+hibernate整合开发所需要的基本JAR包

    同时,利用Spring管理Struts2的Action和Hibernate的Session,实现依赖注入,提高代码的可测试性。 以上就是Struts2、Spring2和Hibernate整合开发所需的基本JAR包及其作用。在实际项目中,可能还需要根据具体需求...

    spring mvc + spring + hibernate 全注解整合开发视频教程 09

    【标题】"Spring MVC + Spring + Hibernate 全注解整合开发视频教程 09" 提供了一次深入了解Java企业级应用开发的机会,特别是在使用Spring MVC、Spring和Hibernate这三大核心框架进行全注解配置的场景下。...

    spring +hibernate +maven 的案例

    4. **整合Spring和Hibernate**:在Spring配置中,通过`<bean>`标签实例化SessionFactory,并使用`<tx:annotation-driven>`启用基于注解的事务管理。在业务逻辑类中,通过@Autowired注解注入所需的DAO或Service层组件...

    spring3.0+hibernate3.3+mysql8.0

    在与Spring和Hibernate整合时,需要正确配置MySQL的JDBC驱动(通常为`mysql-connector-java`),以便Spring的JdbcTemplate或Hibernate可以与数据库进行通信。注意,不同版本的MySQL可能需要对应版本的JDBC驱动,确保...

    spring3+hibernate4+maven+junit 多库多数据源实现

    "Spring3+Hibernate4+Maven+JUnit 多库多数据源实现"是一个典型的Java Web项目配置,它涉及了多个核心技术来处理复杂的数据管理需求。下面将详细阐述这些技术以及如何协同工作以实现多库多数据源。 首先,Spring...

    用于理解Spring+SpringMVC+Hibernate开发流程的例子

    Spring、SpringMVC和Hibernate是Java企业级应用开发中的三大核心框架,它们分别负责不同的职责。Spring作为基础框架,提供依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)...

    Spring mvc+hibernate+mysql Demo

    【Spring MVC + Hibernate + MySQL 整合详解】 在IT领域,Spring MVC、Hibernate和MySQL是构建Web应用程序的常用技术栈。Spring MVC作为Spring框架的一部分,提供了强大的MVC(Model-View-Controller)架构,用于...

    spring4+springmvc4+hibernate4 整合DEMO

    首先,Spring4是Spring框架的第四代版本,它提供了更高效、更灵活的依赖注入机制,支持Java配置和注解驱动,大大简化了Java应用的开发。Spring4还引入了对Java 8的支持,以及对WebSocket协议的增强,使得实时通信...

    Spring MVC4+Hibernate4整合

    - **创建DAO层**:Spring MVC和Hibernate整合时,通常会创建一个通用的DAO接口,如`BaseDao`,并为每个数据库实体类创建对应的DAO实现类,如`UserDaoImpl`,利用Hibernate的Session进行数据库操作。 - **事务管理*...

    Spring+SpringMVC+hibernate集成jar包

    Spring、SpringMVC和Hibernate是Java开发中三大核心框架,它们各自负责应用程序的不同层面:Spring作为基础框架,SpringMVC处理Web层逻辑,而Hibernate则专注于数据持久化。本集成包提供了这三大框架所需的全部jar包...

    Spring+Struts+Hibernate比较详细的整合配置方案

    Spring、Struts和Hibernate是Java Web开发中三大核心框架,它们各自负责不同的职责:Spring作为依赖注入容器和面向切面编程(AOP)框架,提供应用的结构和事务管理;Struts是MVC(模型-视图-控制器)框架,负责处理...

    基于注解的springMVC+hibernate+oracle包含数据库查询

    4. DAO层的设计与实现,利用Hibernate的`Session`和`Transaction`进行数据库操作。 5. Service层的业务逻辑封装,调用DAO层进行数据访问。 6. 单元测试的编写,确保代码质量。 这些知识点是构建企业级Web应用的基础...

Global site tag (gtag.js) - Google Analytics