情景是这样的:当你的dao中定义了某种操作(load),是支持延迟加载的,而lazy存在的前提是session在其生命周期之内,如果在dao中关闭了session,action调用方法时肯定抛出异常,所以要在response结束时关闭session.
request从页面传递到action,然后action调用后台处理,action返回forward进行转向,request到达页面,jsp进行处理,最后生成response,整个过程中,lazy应该一直有效
过滤器有些时候可以大展身手,所以我们不得不想到它。过滤器是横跨整个生命周期的,即在request生成之前filter执行一遍,当response生成后,filter再执行一遍。new一个filter类继承Filter,复写doFilter()方法,然后在这里对session的生命周期进行控制,然后在web.xml中配置它,最后tomcat会自动调用它。然而问题来了,这样的话,它每次都打开了一个不同的session,这样lazy任然不会有效,所以过滤器这时候让我们失望了。
如果可以把session放在一个线程里面,那么就能保证我们操作的对象是同一个session的实例。session的threadlocal是一个map,它的key是线程的标识,value是session。
就像opensessioninview设计模式,如果是hibernate2的话我们要自己去实现它,hibernate3里面做了包装,增加了currentsession,当前的意思是线程相关,在hibernate.cfg.xml中配置:<propertyname="hibernate.current.session.context_class">thread</property>,来告诉hibernate我的currentsession就是从本线程中找到的。Spring中又给我们提供了openSessionInViewFilter来解决这个问题,思路跟上文提到的相同。
posted on 2009-04-01 07:21
肖恩 阅读(327)
评论(0) 编辑 收藏