Spring整合Hibernate时,主要做了两件事:提供事务级session和声明式的事务控制。
在较早的Hibernate中,对于session的管理一般是one-session-per-operation的方式,即一次具体操作一个session。
Spring为了解决这个问题,引入了HibernateTemplate类。
先来看看它的文档中一段很有意思的话:
NOTE: As of Hibernate 3.0.1, transactional Hibernate access code can also be coded in plain Hibernate style. Hence, for newly started projects,consider adopting the standard Hibernate3 style of coding data access objects instead, based on SessionFactory.getCurrentSession().(Spring's LocalSessionFactoryBean automatically supports Spring transaction management for the Hibernate3 getCurrentSession() method.)作者说:在新开始的工程,可以考虑用标准的Hibernate3的编码方式作为HibernateTemplate的替代。因为Hibernate3提供的SessionFactory.getCurrentSession()已经取代了以往那种每次操作都open一个新Session的方式,同时Spring的LocalSessionFactoryBean自动支持Hibernate3的getCurrentSession()的事务管理。也就是说,如果不用HibernateTemplate这咱Spring的专有API,而只用Hibernate3,我们一样可以受用Spring的事务管理。
来详细地看看HibernateTemplate,因为它毕竟简化了Hibernate的操作,但是在有些情况下,我们应该使用Hibernate而不是用HibernateTemplate。根据HibernateTemplate的文档注释,它做了两件事:1.简化了Hibernate的数据访问编码;2.自动地将HibernateExceptions转化为Spring的异常体系中的DataAccessExceptions(这是一个unchecked exception).
HibernateTemplate实现第一点,是通过回调来实现的,它的核心方法execute():
public Object execute(HibernateCallback action, boolean exposeNativeSession)
- throws DataAccessException {
- //这个Session是受Spring事务管理的
- Session session = getSession();
- //这个是怎么回事,还要再仔细看看,我想它应该是关系到Session在这个操作里操作完是否关闭的关键
- boolean existingTransaction = SessionFactoryUtils
- .isSessionTransactional(session, getSessionFactory()); FlushMode previousFlushMode = null;
- try {
- previousFlushMode = applyFlushMode(session, existingTransaction);
- enableFilters(session);
- //在默认情况下,不把Sessin暴露给用户
- Session sessionToExpose = (exposeNativeSession ? session :
- createSessionProxy (session));
-
- //这里是真正涉及到Hibernate操作的地方
- Object result = action.doInHibernate(sessionToExpose);
- flushIfNecessary(session, existingTransaction);
- return result;
- }
- catch(...){
-
-
- }
- }
- finally {
- if (existingTransaction) {
- disableFilters(session);
- if (previousFlushMode != null) {
- session.setFlushMode(previousFlushMode);
- }
- }
- else {
-
- if (isAlwaysUseNewSession()) {
-
- SessionFactoryUtils.closeSession(session);
- }
- else {
- //没有硬性关闭Session,这是区别于Hibernate3以前版本的地方 SessionFactoryUtils.closeSessionOrRegisterDeferredClose
- (session, getSessionFactory());
- }
- }
- }
- }
真正的数据操作是在HibernateCallback action中实现的,为了执行action中的操作,需要一个Session,这个Session是在execute()方法内部获得(不一定是新产生的)并传入的。另外,在操作执行完之后,这个Session没有硬性关闭,而是交由SessionFactoryUtils来决定是否立即关闭还是延迟关闭。有时间再看看SessionFactoryUtils .closeSessionOrRegisterDeferredClose()具体做了些什么。
用HibernateTemplate比起直接用Hibernate编码简洁了很多。但是,作者在文档中写到:The major advantage is its
automatic conversion to DataAccessExceptions, the major disadvantage that no checked application exceptions can get
thrown from within data access code.因为封闭得太好了,我们根本无法干预HibernateTemplate的方法内部,因此我们
不能抛出检查型的应用异常。如果我们想在某个方法的内部在某个条件下抛出自定义的应用异常,就要用Hibernate直接编码了,这是不应该用HibernateTemplate的情况。
作者在文档中还写到:It can be used within a service implementation via direct instantiation(实例)with a SessionFactory reference, or get prepared in an application context and given to services as bean reference. 为了使用
HibernateTemplate,我们需要一个SessionFactory,因为使用HibernateTemplate时需要获取Session,而Session是从SessionFactory获取的。我们可以在应用配置文件中,根据已配置的SessionFactory配置一个HibernateTemplate,或者在程序中要用时再根据已配置好的SessionFactory来产生一个HibernateTemplate。Spring提供了一个可配置的SessionFactory的工厂类,用以向容器暴露一个单例化的SessionFactory:LocalSessionFactoryBean。这个类的源码也很有意思,还要继续看一下。
为了进一步简化Hibernate的操作,Spring提供了一个用于DAO的基类HibernateDaoSupport:This base class is mainly
intended for HibernateTemplate usage。这个类只有唯一的成员变量private HibernateTemplate hibernateTemplate。但是我在想,Spring是不是做的太过分了?包装得太好了??
分享到:
相关推荐
标题"spring整合hibernate示例代码"提示我们,我们将讨论如何在实际项目中结合这两个框架。Spring可以帮助管理Hibernate的SessionFactory和Transaction,提供声明式事务管理,以及通过AOP(面向切面编程)实现更灵活...
标题"Spring整合Hibernate.jar"意味着我们将讨论如何将这两个强大的框架集成在一起,以便在Spring管理的环境中使用Hibernate进行数据库操作。这通常涉及到以下步骤和知识点: 1. **引入依赖**:首先,你需要在项目...
本篇文章将详细探讨如何通过Spring整合Hibernate来实现事务处理,重点介绍注解方式和XML配置方式。 首先,我们了解事务处理在数据库操作中的重要性。事务是一组操作,这些操作要么全部成功,要么全部失败,确保数据...
标题中的“spring整合hibernate的jar包”指的是在Java Web开发中,Spring框架与Hibernate持久层框架的集成。这两个框架结合使用可以提供强大的数据访问和业务逻辑处理能力。Spring作为一个全面的轻量级框架,提供了...
本文将深入探讨Spring整合Hibernate的相关知识点,适合初学者入门。 首先,我们需要理解Spring的核心理念。Spring框架提供了一个轻量级的容器,它能够管理应用程序中的对象,包括初始化、配置和依赖注入。AOP则是...
这篇名为"spring整合hibernate实例"的内容,显然是关于如何将这两个框架协同工作,构建一个高效、灵活的Java应用的教程。在整合过程中,我们将探讨以下几个关键知识点: 1. **Spring的ApplicationContext**: 这是...
《Spring整合Hibernate实战指南》 在Java开发领域,Spring框架以其强大的依赖注入、AOP(面向切面编程)以及丰富的模块支持,成为了企业级应用开发的首选。而Hibernate作为持久层框架,以其对象关系映射(ORM)能力...
Spring整合Hibernate是现代Java开发中常见的一种技术组合,利用Spring框架的强大功能来管理和协调Hibernate的持久化操作。Spring为Hibernate提供了全面的集成方案,简化了DAO(Data Access Object)的开发,同时也...
首先,我们需要理解Spring如何与Hibernate和Struts进行整合: 1. **Spring与Hibernate整合**: - Spring通过其`HibernateTemplate`或`HibernateDaoSupport`类简化了对Hibernate的操作,提供了事务管理。你可以定义...
下面,我们将深入探讨Spring整合Hibernate的相关知识点。 1. **依赖注入**:Spring框架的核心特性之一是依赖注入(DI),它允许我们在不进行硬编码的情况下管理对象之间的依赖关系。在整合Hibernate时,Spring可以...
标题"spring整合hibernate与struts2所需jar包"表明我们需要关注的是如何将这三个框架整合在一起,并且提供了所需的一些基础组件。整合SSH可以让开发者利用Spring的管理能力,让Hibernate更易于使用,同时通过Struts2...
《Spring整合Hibernate详解》 在Java企业级应用开发中,Spring和Hibernate是两个非常重要的框架。Spring作为一个全面的轻量级应用框架,提供了强大的依赖注入、AOP(面向切面编程)以及事务管理等功能;而Hibernate...
Spring整合Hibernate配置测试示例
在"spring整合hibernate开发源码"的压缩包中,可能包含了以下内容: 1. **配置文件**:如`applicationContext.xml`,其中配置了Spring和Hibernate的相关bean,如DataSource、SessionFactory、TransactionManager等。...
这里的jar包只是说Spring自带的关于Hibernate的jar包,即这四个jar包: hibernate3.jar, hibernate-annotations.jar, hibernate-entitymanager.jar hibernate-commons-annotations.jar 因为我原来下载了一个,但是...
这个“Spring+hibernate整合源代码”应该包含了实现上述整合步骤的示例代码,可以作为学习和参考的资源。通过学习和实践这些代码,你可以更好地理解和掌握 Spring 和 Hibernate 整合的细节,提升你的 Java Web 开发...
Spring 整合 Hibernate 是一种常见的企业级应用开发模式,它将 Spring 框架的管理优势与 Hibernate 的持久层功能结合起来,提供了更高效、更稳定的应用解决方案。在本学习笔记中,我们将深入探讨如何实现这一整合,...
Spring整合Hibernate基于HibernateTemplate的方式,极大地简化了数据库操作,同时也让事务管理和代码的编写变得更加规范和高效。在实际项目中,可以根据需求进一步配置和优化,比如使用JPA的...
当我们谈到"Spring整合Hibernate例子"时,这意味着我们将探讨如何将这两个强大的框架结合在一起,以实现更高效、更灵活的数据库操作。 Spring框架的核心特性之一是依赖注入(Dependency Injection,DI),这使得...