Hibernate中session是使用最频繁的对象,我们需要对session进行有效管理,即在执行数据库操作前打开session,在执行操作后关闭session。
对session的管理有两种场景:
1) 没有和Spring集成,我们自己管理
我们调用Hibernate的sessionFactory.openSession()方法,即可创建一个新的session,使用完毕后将它关闭,这是最原始,最简单的管理。但为提高复用,一般我们还会在线程范围内缓存这个session,即一个线程范围内始终使用同一个session。这点可用ThreadLocal变量实现。
这种方式里,session的关闭,以及事务的操作,都需要我们自己来做。
另外,在最新的Hibernate中,已经内置了线程范围的session管理机制,我们只需在Hibernate配置文件中指定hibernate.current_session_context_class为thread,然后调用sessionFactory.getCurrentSession(),即可得到与当前线程绑定的session。
但这种方式要求在一个transactional环境里使用,即我们要显示的进行事务控制(否则会抛出异常)。session也会在事务提交或回滚时被自动关闭。
2) 和Spring集成,利用Spring管理机制
由于Spring有自己的session与线程绑定管理,因此不需要再在需在Hibernate配置文件中指定hibernate.current_session_context_class为thread,否则会出错。
一般我们会继承自Spring的HibernateDAOSupport,然后如果使用Spring的getHibernateTemplate来做数据操作时,Spring将对session进行自动管理,不需手动关闭,而且即使我们没有进行transaction,Spring也会自动进行事务的开始与提交。
如果我们没有使用getHibernateTemplate,而是用geSession接口得到session对象来做后续操作时,如果是在一个transactional环境里,即我们手动创建并控制事务时,session会被自动关闭。但是如果没有进行事务控制,我们每次得到的都是新创建的session,必须手动关闭。
分享到:
相关推荐
Hibernate Session释放模式
No Hibernate Session bound to thread,没有绑定线程解决办法,找了好久才找到的
常用Hibernate主键生成策略 常用Hibernate主键生成策略 常用Hibernate主键生成策略 常用Hibernate主键生成策略
Hibernate-nosession浅谈代码案例。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
可以对hibernate的 Session 和 Transaction 有更深入的认识 希望对一些概念比较模糊的人 有帮助
hibernate配置文件,session工厂学习,session链接数据库
Hibernate 中对session的管理!
hibernate中session的管理描述。 hibernate中session的管理描述。
hibernate中session对象的状态详解
手写hibernate的session实现简单增删改查,适合新手学习hibernate
NULL 博文链接:https://former.iteye.com/blog/676665
Hibernate的透明持久化用起来非常舒服,有时甚至忘记了数据库的存在。我身边的朋友经常会分不清save、saveOrUpdate、update的区别,lock、merge、replicate、refresh、evict甚至不知道是干什么用的。而且关于实体...
hibernate session详细方法,值得珍藏
Hibernate_session_factory_配置
Hibernate主键生成策略.doc ··········
关于Hibernate的各种主键生成策略与配置详解
NULL 博文链接:https://selvemen.iteye.com/blog/457225
如果传入的参数是持久化对象,Session就计划执行一个delete语句。如果传入的参数是游离对象,先使游离对象被Session关联,使它变为持久化对象,然后计划执行一个delete语句。值得注意的是,Session只有在清理缓存的...
JAVA的hibernate手动获取session的方法
Hibernate性能优化策略.详细描述了java性能优化的各种策略高清