HibernateTemplate不用spring aop事务会不会自动关闭session?

解决方案 »

  1.   

    谢谢刚试了下 //Session is closed!东西做到一半突然想起来 有没有关闭?看源码估计要费气力,里面还有很多AOP啥的在里面。。只能做实验了
      

  2.   

    Hibernate 的持久层访问必须按如下步骤进行:(1)创建 Configuration 实例。(2) 创建 SessionFactory 实例。(3)创建 Session 实例。(4) 打开事务。(5) 开始持久化访问。(6) 提交事务。(7) 如果遇到异常,回滚事务。(8) 关闭 Session。虽然可以采用类似于 HibernateUtils i具类封装了部分过程,但依然不够简沽,需要通过代码显式地打开 Session,开始事务,然后关闭事务,最后关闭 Session。而 Spring提供更简单的方式操作持久层,无须显式地打开 Session,也无须在代码中执行任何的事务操作语句。Spring 提供了 HibernateTemplate,用于持久层访问,该模板类无须显示打开 Session及关闭 Session。它只要获得 SessionFactory 的引用,将可以智能打开 Session,并在持久化访问结束后关闭 Session ,程序开发只需完成持久层逻辑,通用的操作则由HibernateTemplate 完成。事务的处理,当然也可以采用编程式事务。 Spring 提供了编程式事务的支持。通常,推荐使用声明式事务,使用声明式事务有如下优点:代码中无须实现任何事务逻辑,程序开发者可以更专注于业务逻辑的实现。声明式事务不与任何事务策略藕合,采用声明式事务可以方便地在全局事务和局部事务之间切换。Spring 的声明式事务以 Spring 的 AOP 为基础,开发者可以不需要对 AOP深入了解,只需按本章后面部分配置声明式事务代理即可。Spring 对 Hibernate 的简化,还得益于 Spring 异常处理策略。 Spring 认为:底层数据库异常几乎都不可恢复,强制处理底层数据库几乎没有任何意义,但传统 JDBC 数据库访问的异常都是 checked 异常,必须使用 try...、 catch 块处理。另外, Spring 包装了 Hibernate 异常,并转换到 DataAccessException 继承树内,所有 DataAccessException 全部是 runtime 异常,但并不强制捕捉。归纳起来, Spring 对Hibernate 的简化主要有如下几个方面。基于依赖注入的 SessionFactory 管理机制, SessionFactory 是执行持久化操作的核心组件。传统 Hibernate 应用中, SessionFactory 必须手动创建,通过依赖注入,代码无须关心 SessionFactory,而它的创建和维护由 BeanFactory 负责管理。更优秀的 Session 管理机制。 Spring 提供"每事务一次 Session" 的机制,该机制能大大提高了系统性能,而且 Spring 对 Session 的管理是透明的,无须在代码中操作 Session。统一的事务管理。无论是编程式事务,还是声明式事务, Spring 都提供一致的编程模型,无须烦琐的开始事务、显式提交及回滚。如果使用声明式事务管理,可将事务管理逻辑与代码分离,使事务可在全局事务和局部事务之间切换。统一的异常处理机制。不再强制开发者在持久层捕捉异常,通常持久层异常被包装成 DataAccessException 异常的子类,将底层数据库异常包装成业务异常,开发者可以自己决定在合适的层处理异常。HibernateTemplate 支持类。 HibernateTempate 能完成大量 Hibernate 持久层操作,这些操作大多只需要一些简单的代码即可实现。