Hibernate中的session和transaction详细分析

[color=red]Hibernate中的session,[/color]其实是个实体管理器。Hibernate内存里面的对象主要有三种状态
(1)瞬时状态,即对象刚被new出来的时候
(2)持久化状态,被session管理的时候,比如我们调用session.save(user)时
(3)离线状态,session关闭掉了
那hibernate是如何管理内存里面的对象的呢,其实被hibernate管理的对象都有一个id,而session里面有一个Map,《key,value》,其中的key就是指向对象的id,而value即对象本身,值得说明的是,当session关闭后,对象仍然就有id这个属性。
hibernate中有个重要提高性能的方法就是所谓的懒加载,我们可以通过设置lazy=true来实现。懒加载的意思就是说加载对象的时候其实只是加载对象的代理,直到我们用到这个对象的时候才真正从数据库里面读取。这样就带来一个问题---懒加载异常。因为懒加载的时候session一定要是open的才行,而在我们实际事务操作中,
  (1) Begin
(2)dosomething
(3)close

这时候我们的session已经关闭,事务的管理很重要,我们知道我们的session什么时候应该关闭。
而在SSH开发的时候每一次request其实就是一个线程,我们要做每一个线程都对应同样一个session,这样我们才可以合理的进行open和close的操作。要实现这个需求,就必须要吧session和线程相关,可喜的hibernate提供了getcurrentsession这个函数,这个currentsession就是当前线程的session,那我们的session应该什么时候打开,什么时候关闭呢?
首先要搞清楚,request和response。一个HTTPrequest首先会经过filter,ffilter会调用doFilter方法,doFilter里面有一个参数chain 也就是一个request会在chain中不断传递,直到到了jsp为止,只是编译jsp产生response这时候我们也可以关闭我们的session。
其实这样还有问题,那就是事务的transaction每次都要begin的问题,假如我们在同一件事务调用两个不相干类的方法,那么假如transaction是在类的方法里面定义的,那么这两个transaction就不是同一个transaction,这样出现exception的时候数据就不能得到有效的回滚。为来保证事务的transaction和session同步,spring也有关于事务的配置。简单来说就是把session和transaction一起绑定。
Spring中的事务管理是通过AOP来实现的,即拦截方法,是一个独立的类,没有任何的依赖。所以我们自己就不需要自己管理事务,真是轻松。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值