OpenSessionInViewFilter更新问题

 
在项目中配置OpenSessionInViewFilter后,首先会出现的问题:
Java代码
  1. org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

这个是因为OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flushMode 设为FlushMode.NEVER。然后把该sessionFactory绑定到TransactionSynchronizationManager,使request的整个过程都使用同一个session。
FlushMode.NEVER模式不具备写操作,可以把session配置为FlushMode.AUTO,如在web.xml中配置:
Xml代码
  1. <filter>
  2. <filter-name>OpenSessionInView</filter-name>
  3. <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  4. <init-param>
  5. <param-name>flushMode</param-name>
  6. <param-value>AUTO</param-value>
  7. </init-param>
  8. </filter>


其次,会遇到的另外一个问题是页面更新操作,因为这个流程是:首先查询取得数据库中的记录,修改客户端改变的属性,更新这个实体类。这是通过以上配置OpenSessionInViewFilter,在session更新实体类之前,session已经存在一个实体类,与客户端传过来的需要修改的实体类会发生冲突,以致更新失败。这个可以通过配置singleSession=false解决。也可以通过重写OpenSessionInViewFilter类的getSession及closeSession方法实现,如:
Java代码  复制代码
  1. public class MyOpenSessionInViewFilter extends OpenSessionInViewFilter{
  2. @Override
  3. protected void closeSession(Session session, SessionFactory sessionFactory) {
  4. session.flush();
  5. session.getTransaction().commit();
  6. super.closeSession(session, sessionFactory);
  7. }
  8. @Override
  9. protected Session getSession(SessionFactory sessionFactory)
  10. throws DataAccessResourceFailureException {
  11. Session session = SessionFactoryUtils.getSession(sessionFactory, true);
  12. session.beginTransaction();
  13. FlushMode flushMode = getFlushMode();
  14. if (flushMode != null) {
  15. this.setFlushMode(FlushMode.AUTO);
  16. }
  17. return session;
  18. }
  19. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值