Hibernate中的session和transaction详细分析

Hibernate中的session,其实是个实体管理器。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来实现的,即拦截方法,是一个独立的类,没有任何的依赖。所以我们自己就不需要自己管理事务,真是轻松。

相关推荐