`
liwanchun_xd
  • 浏览: 120505 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

Spring整合Hibernate之Session

阅读更多
转载:http://bbs.tech.ccidnet.com/read.php?tid=557959

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) m_),}
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));
//exposeNativeSession默认值为false ;
//这里是真正涉及到Hibernate操作的地方
Object result = action.doInHibernate(sessionToExpose);
flushIfNecessary(session, existingTransaction);
return result; }
}
catch(...){
//将Hibernate代码抛出的HibernateException,SQLException
//转化为 DataAccessExceptions,如果有运 行时异常,将其抛出
}
}
finally {
if (existingTransaction) {
disableFilters(session);
if (previousFlushMode != null) {
session.setFlushMode(previousFlushMode);
}
}
else {
// Never use deferred close for an explicitly new Session.
if (isAlwaysUseNewSession()) {
//这里的默认值是false,所以此次操作结束后,session不会在此关闭
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是不是做的太过分了?包装得太好了??

对于使用sessionFactory.getCurrentSession()方式下,会自动更改autocommit=false,建议以事务方式运行。而openSession(),autocommit则不会改动。
在Spring中SessionFactoryUtils.doGetSession()实现Session的获取。
分享到:
评论

相关推荐

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    第24次课-1 Spring与Hibernate的整合

    第24次课-1 Spring与Hibernate的整合 本节主要内容 24.1 概述 24.2 管理SessionFactory 24.3 Spring对Hibernate的简化 24.1 概述 24.1.1 概述 Spring提供了很多IoC特性的支持,方便处理大部分典型的Hibernate整合...

    Spring4.0+Hibernate4.0+Struts2.3整合案例

    Spring4.0+Hibernate4.0+Struts2.3整合案例:实现增删改查。 ===================== application.xml: xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...

    整合jsf hibernate spring实例

    部门人员一对多的CRUD操作 hibernate: 管理实体...spring:数据源配置与获得session IOC依赖注入 和 AOP 事务管理 jsf : backing bean的操作 jsf 标签应用 jsf 信息国际化以资源绑定 jsf 表单验证 jsf 导航设定

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    12.6 整合Struts、Spring和Hibernate实现用户管理 12.6.1 Struts、Spring和Hibernate的整合方式 12.6.2 编写用户注册画面regedit.jsp 12.6.3 编写用户登录画面login.jsp 12.6.4 编写注册控制器RegeditAction.java ...

    Spring-session2整合spring5+redis

    spring5+hibernate5+Spring-session-data-redis2+Spring-data-redis2整合

    ssh框架整合step by step (springMVC + spring 5.0.4 + hibernate 5.0.12)

    ③ 整合hibernate # 使用entity/dao/service全部使用注解扫描, 大大减少再开发的代码量; # 事务的织入: 开发时不必再处理SessionFactory、Session等, 只要按配置文件指定的格式对方法进行命名, 即可自动开启/提交...

    SSH整合 struts+hibernate+spring

    SSH整合概述 应用IoC进行整合 应用AOP进行整合 Open Session In View模式

    整合spring3-hibernate的小项目(一)

    【SSH学习笔记】整合spring3-hibernate的小项目(一) 配套资源 需求分析: 1、使用spring注入dataSourse数据源 2、使用BaseDao获取注入SessionFactory并返回Session 3、实现查询所有和按字符串查询的方法 4、...

    Struts Spring Hibernate 整合 OpenSessionInView 例子

    为了练手培训,给大家准备的 Open Session In View 的简单例子,纯代码,大家可以参考,其中主要说了六部分内容: 1.通过接口编程 2.通过spring注入dao到 action 3.通过 open session in view filter 支持 延迟加载...

    整合spring3-hibernate的小项目(二)

    【SSH学习笔记】整合spring3-hibernate的小项目(二) 配套资源 需求分析: 1、使用spring注入dataSourse数据源 2、使用BaseDao获取注入SessionFactory并返回Session 3、用generic接口及其实现类,实现泛型化的...

    SpringMVC+Hibernate+annotation+Easyui权限管理系统

    SpringMVC+Hibernate+annotation+Easyui权限管理系统,Session过期控制(包括Ajax请求的过期控制),访问权限控制(权限控制到按钮),hibernate数据库用户名与密码加密,其它的不说了,绝对物有所值

    Spring的学习笔记

    三、 Spring整合hibernate3事务 31 (一) Annotation注解方式配置事务管理 31 (二) Spring事务选项 35 (三) XML文件形式配置Spring事务管理 37 四、 HibernateTemplate 38 (一) HibernateTemplate 38 (二) ...

    SHH整合(mysql,struts2 2.2+spring2.5+hibernate3.0,log,jquery,标签等)DEMO

    1、SHH整合 详细清晰的标准配置,主流的应用配置,struts2.2+spring2.5+hibernate3.0 2、结合MYSQL轻量级数据库,有写好的库表sql 3、整合日志管理配置,及Spring代理日志管理的配置及应用 4、应用WEB前段主流技术,...

    struts2.3.x+spring3.1.x+hibernate3.6 demo

    十分抱歉,上次整合的是一个半成品,spring3.1和hibernate4.1目前为止我测试了,整合过程中有很多问题!关键问题有几个,第一个HibernateDaoSupport这个没有了,在使用hibernateTemplate的时候,报错误:java.lang....

    spring2.5 学习笔记

    三、 Spring整合hibernate3事务 31 (一) Annotation注解方式配置事务管理 31 (二) Spring事务选项 35 (三) XML文件形式配置Spring事务管理 37 四、 HibernateTemplate 38 (一) HibernateTemplate 38 (二) ...

    SSH整合中 hibernate托管给Spring得到SessionFactory

    Spring文件中的 SessionFactory中 加入为了能得到同一个Session

    SpringAll_wuyouzhuguli.tar.gz

    Spring Boot配合Hibernate Validator参数校验 自定义Spring Boot 内容协商 Spring Boot 中处理跨域 Spring Boot 中的异步调用 Spring Boot 整合Kafka Spring Boot整合Mongo DB Spring Boot 2.0 WebFlux编程 Spring ...

Global site tag (gtag.js) - Google Analytics