Hibernate - Write operations are not allowed in read-only mode 解决方案

7 篇文章 0 订阅
3 篇文章 0 订阅

代码 demo

@Service
public class LogDAOImpl extends AbstracRepositoryImpl implements ILogDAO {

    @Override
    public String saveLog(LogAggregateRoot log){
        MsLog msLog = new MsLog();
        msLog.setUserId(log.getUserId());
        msLog.setOptFlowType(Integer.valueOf(log.getOptFlowType()));
        msLog.setRoleType(Byte.valueOf(log.getRoleType()));
        msLog.setServiceOrderId(Long.valueOf(log.getBizNo()));
        msLog.setRemark(log.getDetail());
        msLog.setCreatedTime(log.getOptTime());
        msLog.setStatus(log.getStatus());
        return super.save(msLog).getLogId().toString();
    }
}

报错报文

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.

问题分析

That error message is typically seen when using the Spring OpenSessionInViewFilter and trying to do persistence operations outside of a Spring-managed transaction. The filter sets the session to FlushMode.NEVER/MANUAL .
当使用 Spring OpenSessionInViewFilter并尝试在 Spring 管理的事务之外执行持久性操作时,通常会看到该错误消息。过滤器将会话设置为 FlushMode.NEVER/MANUAL。

解决方案

1、添加事务(@Transactional)

当 Spring 事务机制开始一个事务时,它将刷新模式更改为“COMMIT”。事务完成后,它会根据需要将其设置回 NEVER/MANUAL。

@Service
public class LogDAOImpl extends AbstracRepositoryImpl implements ILogDAO {

    @Override
    @Transactional(rollbackFor = Exception.class)
    public String saveLog(LogAggregateRoot log){
        MsLog msLog = new MsLog();
        msLog.setUserId(log.getUserId());
        msLog.setOptFlowType(Integer.valueOf(log.getOptFlowType()));
        msLog.setRoleType(Byte.valueOf(log.getRoleType()));
        msLog.setServiceOrderId(Long.valueOf(log.getBizNo()));
        msLog.setRemark(log.getDetail());
        msLog.setCreatedTime(log.getOptTime());
        msLog.setStatus(log.getStatus());
        return super.save(msLog).getLogId().toString();
    }
}
2、关闭检查Hibernate会话是否处于只读模式(setCheckWriteOperations(false))

设置写入操作(保存/更新/删除)时是否检查Hibernate会话是否处于只读模式。

默认值为“true”,表示在只读事务中尝试写入操作时的快速失败行为。关闭此选项以允许在刷新模式为手动的会话上保存/更新/删除。

@Service
public class LogDAOImpl extends AbstracRepositoryImpl implements ILogDAO {

    @Override
    public String saveLog(LogAggregateRoot log){
        MsLog msLog = new MsLog();
        msLog.setUserId(log.getUserId());
        msLog.setOptFlowType(Integer.valueOf(log.getOptFlowType()));
        msLog.setRoleType(Byte.valueOf(log.getRoleType()));
        msLog.setServiceOrderId(Long.valueOf(log.getBizNo()));
        msLog.setRemark(log.getDetail());
        msLog.setCreatedTime(log.getOptTime());
        msLog.setStatus(log.getStatus());
        super.getHibernateTemplate().setCheckWriteOperations(false);
        return super.save(msLog).getLogId().toString();
    }
}

参考:
https://docs.spring.io/spring-framework/docs/3.0.x/javadoc-api/org/springframework/orm/hibernate3/support/OpenSessionInViewFilter.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端马农

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值