关于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>