Write operations are not allowed in read-only mode (FlushMode.MANUAL)

SSH 同时被 2 个专栏收录
1 篇文章 0 订阅
2 篇文章 0 订阅

背景

使用的环境:hibernate5和springframework4.3

第一次整合SSH框架,在一个插入(save)操作中抛出这个异常

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

大概是说在只读模式下不允许写操作,凡是增删改都是写操作,怪不得,在save方法之前执行的get方法没有抛这个异常

解决

第一步

在web.xml文件中增加一个OpenSessionInViewFilter

1.将FlushMode改为AUTO

2.注意这个OpenSessionInViewFilter要配置在org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter这个Struts2的全局Filter之前,因为web.xml文件中的Filter加载是按先后顺序来的

3.如果你是整合SSH的话,你在application-context.xml文件中势必要注册SessionFactory,OpenSessionInViewFilter的SessionFactoryBeanName的值要和application-context.xml中的SessionFactory的Bean的name属性值一样

 

    <filter>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
        <init-param>
            <param-name>flushMode</param-name>
            <param-value>AUTO</param-value>
        </init-param>
        <init-param>
            <param-name>sessionFactoryBeanName</param-name>
            <param-value>sf</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

第二步

在Dao层的实现类中涉及到写操作的方法的执行代码之前,先执行

getSessionFactory().getCurrentSession().setFlushMode(FlushModeType.AUTO);

例如:

    public void addProduct(Product product) {      
        //先执行这一步,再进行写操作
        getSessionFactory().getCurrentSession().setFlushMode(FlushModeType.AUTO);
        save(product);
    }

 

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

a2940093904

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值