博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于spring+hibernate的FlushMode的记录
阅读量:3575 次
发布时间:2019-05-20

本文共 1180 字,大约阅读时间需要 3 分钟。

参见hibernate的api说明

说明FlushMode有五种属性

NEVER

已经废弃了,被MANUAL取代了

MANUAL

spring3.x中的opensessioninviewfilter已经将默认的FlushMode设置为MANUAL了;

如果FlushMode是MANUAL或NEVEL,在操作过程中hibernate会将事务设置为readonly,所以在增加、删除或修改操作过程中会出现如下错误

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove ‘readOnly’ marker from transaction definition;

解决办法网上有很多;

1. 配置事务,spring会读取事务中的各种配置来覆盖hibernate的session中的FlushMode;
2. 先编程式修改FlushMode,比如session.setFlushMode(FlushMode.AUTO); 这样hibernate就会自动去除readonly限制;
3. 直接修改opensessioninviewfilter过滤器的配置,配置过滤器的时候配置

openSession
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
flushMode
AUTO

AUTO

设置成auto之后,当程序进行查询、提交事务或者调用session.flush()的时候,都会使缓存和数据库进行同步,也就是刷新数据库。

COMMIT

提交事务或者session.flush()时,刷新数据库;查询不刷新。

ALWAYS

每次进行查询、提交事务、session.flush()的时候都会刷数据库

这里需要说一下和AUTO的区别,当hibernate缓存中的对象被改动之后,会被标记为脏数据(即与数据库不同步了)。当session设置为FlushMode.AUTO时,hibernate在进行查询的时候会判断缓存中的数据是否为脏数据,是则刷数据库,不是则不刷,而always是直接刷新,不进行任何判断。很显然auto比always要高效得多。

转载地址:http://xnjgj.baihongyu.com/

你可能感兴趣的文章
实现自己的权限管理系统(十四):工具类
查看>>
JavaWeb面经(二):2019.9.16 Synchronized关键字底层原理及作用
查看>>
牛客的AI模拟面试(1)
查看>>
深入浅出MyBatis:MyBatis解析和运行原理
查看>>
Mybatis与Ibatis
查看>>
字节码文件(Class文件)
查看>>
java中的IO流(一)----概述
查看>>
StringBuilder
查看>>
集合,Collection
查看>>
泛型详解
查看>>
泛型实现斗地主
查看>>
List集合
查看>>
ArrayList集合,LinkedList集合,Vector集合
查看>>
HashSet集合
查看>>
并发与并行,线程与进程
查看>>
方法引用,通过对象名引用成员变量
查看>>
常用工具类 Math:数学计算 Random:生成伪随机数 SecureRandom:生成安全的随机数 2020-2-13
查看>>
Java的异常Exception 2020-2-13
查看>>
Java标准库定义的常用异常,自定义异常 2020-2-15
查看>>
Java问题百度/Google记录 2020-2-16
查看>>