关于OpenSessionInViewFilter、百度来的、记录下

首先要说明一下OpenSessioninView的作用,就是允许在每次的整个request的过程中使用同一个hibernatesession,可以在这个request任

何时期lazyloading数据。

如果是singleSession=false的话,就不会在每次的整个request的过程中使用同一个hibernatesession,而是每个数据访问都会产生各自的seesion,等于没有OpenSessioninView.

OpenSessionInViewFilter默认是不会对session进行flush的,并且flushmode是never

代码:

protectedSessiongetSession(SessionFactorysessionFactory)throwsDataAccessResourceFailureException{

Sessionsession=SessionFactoryUtils.getSession(sessionFactory,true);

session.setFlushMode(FlushMode.NEVER);

returnsession;

}

看getSession的方式就知道,把flushmode设为FlushMode.NEVER,这样就算是commit的时候也不会sessionflush,

如果想在完成request过程中更新数据的话,那就需要先把flushmodel设为FlushMode.AUTO,再在更新完数据后flush.

.

OpenSessionInView默认的FlushMode为

代码:

FlushMode.NEVER

::::::::::解决方法::::::::::::

可以采用spring的事务声明解决,示例代码如下:

<!--声明一个Hibernate3的事务管理器供代理类自动管理事务用-->

<beanid="transactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<propertyname="sessionFactory"ref="sessionFactory"/>

</bean>

<aop:config>

<!--切入点指明了在执行com.ssh2.manager包中的所有方法时产生事务拦截操作-->

<aop:pointcutid="daoMethods"expression="execution(*com.ssh2.manager.*.*(..))"/>

<!--定义了将采用何种拦截操作,这里引用到txAdvice-->

<aop:advisoradvice-ref="txAdvice"pointcut-ref="daoMethods"/>

</aop:config>

<!--事务通知操作,使用的事务管理器引用自transactionManager-->

<tx:adviceid="txAdvice"transaction-manager="transactionManager">

<tx:attributes>

<!--指定哪些方法需要加入事务-->

<tx:methodname="getPageTable*"propagation="REQUIRED"/>

<tx:methodname="getTotalRecodes"propagation="REQUIRED"/>

<tx:methodname="save*"propagation="REQUIRED"/>

<tx:methodname="delete*"propagation="REQUIRED"/>

<tx:methodname="update*"propagation="REQUIRED"/>

</tx:attributes>

</tx:advice>

相关推荐