首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

open session in view, RequestContextListener跟DAO

2012-11-18 
open session in view, RequestContextListener和DAOthe FilterInputStream is a type of InputStream, to

open session in view, RequestContextListener和DAO

the FilterInputStream is a type of InputStream, to provide a base class for "decorator"
classes that attach attributes or useful interfaces to input streams. BufferedInputStream和DataInputStream等是它的子类

Open Session In view

转载自: http://www.yybean.com/opensessioninviewfilter-role-and-configuration一、作用

Spring为我们解决Hibernate的Session的关闭与开启问题。
Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常

(eg: org.hibernate.LazyInitializationException:(LazyInitializationException.java:42)
- failed to lazily initialize a collection of role: cn.easyjava.bean.product.ProductType.childtypes, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: cn.easyjava.bean.product.ProductType.childtypes, no session or session was closed)

用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。目的是为了实现"Open Session in View"的模式。例如: 它允许在事务提交之后延迟加载显示所需要的对象。

而Spring为我们提供的OpenSessionInViewFilter过滤器为我们很好的解决了这个问题。OpenSessionInViewFilter 的主要功能是用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。目的是为了实现"Open Session in View"的模式。例如:它允许在事务提交之后延迟加载显示所需要的对象。
OpenSessionInViewFilter 过滤器将 Hibernate Session 绑定到请求线程中,它将自动被 Spring 的事务管理器探测到。所以 OpenSessionInViewFilter 适用于 Service 层使用HibernateTransactionManager 或 JtaTransactionManager 进行事务管理的环境,也可以用于非事务只读的数据操作中。

二、配置

它有两种配置方式OpenSessionInViewInterceptor和OpenSessionInViewFilter(具体参看SpringSide),功能相同,只是一个在web.xml配置,另一个在application.xml配置而已。

Open Session In View在request把session绑定到当前thread期间一直保持hibernate session在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以lazy loading数据,如 ${ company.employees }。当View 层逻辑完成后,才会通过Filter的doFilter方法或Interceptor的postHandle方法自动关闭session。

OpenSessionInViewInterceptor配置

<beans>
?
<bean name="openSessionInViewInterceptor"
?
ref="transactionManager"/>
?
<property name="proxyTargetClass" value="true"/>
?
<property name="transactionAttributes">
?
<props>
?
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
?
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
?
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
?
<prop key="save*">PROPAGATION_REQUIRED</prop>
?
<prop key="add*">PROPAGATION_REQUIRED</prop>
?
<prop key="update*">PROPAGATION_REQUIRED</prop>
?
<prop key="remove*">PROPAGATION_REQUIRED</prop>
?
</props>
?
</property>
?
</bean>
?
<bean id="userService" parent="baseTransaction">
<property name="target">
?
<bean scope="request"/>

session

??? session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效,配置实例:

配置实例:

和request配置实例的前提一样,配置好web启动文件就可以如下配置:

<bean id="role" scope="session"/>

==============================

http://wiki.springside.org.cn/display/springside/SpringSide+Hibernate

节选:

第一层:HibernateGenericDao,基于spring的HibernateDaoSupport,但加入了分页函数与各种Finder函数,并使用泛型避免了返回值强制类型转换。

第二层:HibernateEntityDao,基于HibernateGenericDao,用泛型声明Dao所管理的Entity类,默认拥有该entity的CRUD方法。

第三层:HibernateExtendDao,基于HibernateEntityDao,主要扩展各种选择性的功能。

热点排行