打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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. }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
关于OpenSessionInView
Spring?的OpenSessionInViewFilter简介
hibernate exception 报错 异常【重点】【总结】
项目中遇到关于OpenSessionInViewFilter的默认sessionFactoryBeanName的问题
解决 Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker(2014-06-29)
OpenSessionInViewFilter 配置解决延迟加载
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服