I was recently working with Spring and Hibernate on a pet project and ran into some issues with Session and Transaction management that proved to be pretty interesting in the end. The following assumes a working knowledge of Hibernate and Spring...
I was in the midst of writing some JUnit 4.x tests using SpringJUnit4ClassRunner and the @TransactionalConfiguration / @Transactional annotations for automatic rollback of @Test methods. I wanted to do some manipulation of the database prior to my tests using a separate method annotated with @Before. What I was reminded of very quickly is that Spring's class runner will not apply a transactional aspect to this method since it's not actually a @Test. This isn't a problem if you are using HibernateTemplate / HibernateCallback, since it ultimately has a reference back to your TransactionManager to handle transactions. But if you want to work with the raw Hibernate APIs it can be problematic.
There are two things to keep in mind: (1) SessionFactory.getCurrentSession() will only work if you have configured the SessionFactory appropriately, and (2) depending on the configuration, you may have to manage Transactions explicitly. The configuration property in question is "hibernate.current_session_context_class" and it is commonly configured one of three different ways:
1. Omitted the property from the configuration
Hibernate will throw an exception on calls to getCurrentSession() complaining that there is no CurrentSessionContext configured.
2. Configured with 'thread'
hibernate.current_session_context_class=thread
Hibernate will bind the Session returned from getCurrentSession() to the current thread and you must manage transactions programmatically. Generally all that's required is to call Session.beginTransaction(). You can also invoke Transaction.commit() or rollback() if you wish.
3. Configured with SpringSessionContext
hibernate.current_session_context_class=org.springframework.orm.hibernate3.SpringSessionContext
Hibernate will assume it is executing inside of a Spring transactional context (i.e. through a Spring transactional aspect) and Spring will now manage your transaction for you. However if you call getCurrentSession() outside of such a context, Hibernate will throw an exception complaining that no Session is bound to the thread.
What does all this mean?
- Use SpringSessionContext if your operations will be done through classes that are invoked through a Spring-managed transactional context or if you can introduce HibernateTemplate and/or HibernateCallback wherever you need it.
- Use "thread" if you need to raw with the raw Hibernate Session/Transaction API and remember that you'll need to manage transactions programmatically.
URL:http://histos.net/blog/2008/12/on-hibernate-spring-sessions-and-transactions.html
相关推荐
Struts1.2、Spring2.5和Hibernate3.2是经典的Java企业级开发框架组合,它们各自在应用程序的不同层次上发挥着重要作用。Struts1.2是一个MVC(Model-View-Controller)框架,主要负责处理用户界面与业务逻辑之间的...
Struts2、Spring2.5和Hibernate3.2是Java Web开发中经典的三大框架,它们的整合使用在过去的许多年里被广泛应用于企业级应用系统。这个完整的项目提供了从开发环境到运行环境的所有必要组件,包括数据库脚本,使得...
Struts2.1、Spring 2.5 和 Hibernate 3.2 是经典的Java Web开发框架组合,用于构建高效、可维护的企业级应用。这个详细例子将深入探讨如何使用这三个框架协同工作,实现数据库的增(Add)、删(Delete)、改(Modify...
Struts2、Spring2.5和Hibernate3.2是经典的Java Web开发框架组合,被称为SSH(Struts2、Spring、Hibernate)集成。这个整合包可能是为了帮助开发者快速搭建基于这些技术的项目环境。 Struts2是MVC(Model-View-...
Struts2、Spring和Hibernate是Java Web开发中的三...以上就是关于“Struts2+Spring2.5+Hibernate3.2整合示例”的主要知识点,这个整合实例涵盖了Java Web开发中的重要技术,对于开发者来说,深入学习和实践将非常有益。
- **Spring2.5中文开发参考手册.chm**:这份文档会详细介绍Spring 2.5 的核心概念、配置、API使用以及如何在实际项目中应用Spring框架。 - **Hibernate_3.2.0_api.chm**:这份文档是Hibernate 3.2.0 的API参考,包含...
标题 "spring2.5 + hibernate3.2 实例源码" 涉及到的是两个非常关键的Java企业级开发框架:Spring 2.5和Hibernate 3.2。这个实例源码提供了如何将这两个框架集成并进行实际应用的示例。 Spring 2.5是Spring框架的一...
Spring 作为一个全面的后端应用程序框架,提供了依赖注入、面向切面编程、事务管理等功能,而 Hibernate 则是一个强大的对象关系映射(ORM)框架,简化了数据库操作。 Spring 框架的核心在于其依赖注入(Dependency...
标题“spring2.5_hibernate3.2_ibatis2.0_pdf”暗示了这是一个关于Spring 2.5、Hibernate 3.2和iBatis 2.0这三大Java开发框架的综合教程或文档集合,可能以PDF格式提供。这些框架在企业级Java应用程序开发中占有重要...
Struts2.0、Spring2.5和Hibernate3.2是经典的Java企业级开发三大框架,它们的集成应用为开发者提供了强大的模型-视图-控制器(MVC)架构支持,实现了业务逻辑、数据持久化和控制流程的解耦。下面将详细介绍这三个...
文档"Struts1.2+Spring2.5+Hibernate3.2框架搭建(周禄康).doc"和"Struts1.2+Spring2.5+Hibernate3.2框架搭建(原版)(周禄康).doc"可能包含了详细的步骤和示例代码,帮助读者理解如何实际操作。"Struts+...
Struts2.0、Spring2.5和Hibernate3.2是经典的Java企业级开发框架组合,通常被称为SSH(Struts2、Spring、Hibernate)集成框架。这个组合在2000年代末到2010年代初广泛应用于构建大型、复杂的企业级Web应用。SSH框架...
Hibernate3.2引入了许多增强,如Criteria查询、HQL(Hibernate Query Language)和第二级缓存,提高了开发效率和性能。它通过SessionFactory和Session接口来管理数据库连接和事务,支持实体生命周期的管理,如持久化...
Struts2.0、Spring2.5和Hibernate3.2是经典的Java企业级开发框架组合,被称为SSH架构。这个架构组合在2000年代末到2010年初非常流行,为大型企业级应用提供了强大的模型-视图-控制器(MVC)支持、依赖注入(DI)以及...
### Spring2.5 + Hibernate3.2 + Struts2.0 组合配置说明 在当前的软件开发领域,Spring2.5、Hibernate3.2 和 Struts2.0 这三个框架因其卓越的性能与丰富的功能而备受青睐。它们分别在业务逻辑层管理、数据持久化...
标题 "flex3.0+spring2.5+hibernate3.2" 指的是一种集成技术,它将Adobe Flex 3.0(一种用于构建富互联网应用程序的框架)与Spring 2.5(一个Java企业级应用的IOC和AOP容器)和Hibernate 3.2(一个流行的关系型...
本资料主要关注的是一个经典的Java Web开发技术栈,即ecSide、Struts2、Spring 2.5和Hibernate 3.2,以及与之配合使用的MySQL数据库。下面将详细阐述这些技术及其相互间的整合。 **ecSide** 是一个基于Spring的轻量...
总结来说,这个项目展示了如何使用Struts2作为控制器处理用户交互,Spring2.5进行依赖管理和事务处理,而Hibernate3.2则负责对象与数据库之间的映射。尽管没有独立的业务层,但这个设计仍然能有效地实现用户登录功能...
Struts2.0、Spring2.5和Hibernate3.2是Java开发中广泛使用的三大开源框架,它们分别在MVC(Model-View-Controller)架构的不同层面上提供强大的支持,形成了SSH(Struts2 + Spring + Hibernate)集成框架。...
Struts2、Spring2.5和Hibernate3.2是经典的Java Web开发框架组合,它们各自在应用程序的不同层面提供了强大的功能。这个"sshTest"项目是一个使用这三个框架的注解配置的完整Eclipse工程,同时也包含了数据库脚本,...