flush(), clear(), save()的简单解释

hibernate最新发布包的javadoc里对这三个方法的解释是:  clear() :Completely clear the session.清空session,该清空操作只对于要保存的、删除的和修改的数据起作用,不涉及查询的结果。  close() :End the session by releasing the JDBC connection and cleaning up.释放并清空JDBC连接。但是不一定非得关闭session。  flush(): Force this session to flush.强制刷新流的缓冲。flush必须在一个操作单元结束之后且在提交事务和关闭连接之前被调用。例如插入一条数据。sess.save(user);的意思是将user持久化,也就是说把数据插入到数据库中。清空缓存是在持久化之后进行的。至于要不要清空缓存,是要看你的FlushMode是怎么设置的。

 session.clear()方法负责清空session缓存中的实体对象,不管缓存中数据是否与数据库记录一致;

 session.flush()方法负责同步session缓存中的实体对象与数据库记录,保持数据的一致性。

 1 @Test
 2 public void testSessionClear() {
 3   Session session = sessionFactory.openSession();
 4   session.beginTransaction();
 5   Teacher t = (Teacher) session.get(Teacher.class, 3);
 6   System.out.println(t.getName());
 7   session.clear();         //这里不clear只会执行一次sql语句,有clear会执行2次
 8   Teacher t2 = (Teacher) session.get(Teacher.class, 3);
 9   System.out.println(t2.getName());
10   session.getTransaction().commit();
11 }
如果不是clear(),由于一级缓存的存在,查询同样的记录,只会发出一条sql语句;如果清空了session缓存,那么这里会发出2条sql语句。 
@Test
public void testFlush()
{
  Session session =  sessionFactory.openSession();
  session.beginTransaction();
  Teacher t = (Teacher) session.get(Teacher.class, 3);
  t.setName("xiu");
  session.flush();           //有flush会执行2次UPDAE,没有会只执行一次
  t.setName("aty");
  session.getTransaction().commit();
}

如果不执行flush,只会发出一条update语句;执行了flush,会发出2条update语句,也就是说flush会强制缓存与数据库数据同步
时间: 2024-08-28 12:11:32

flush(), clear(), save()的简单解释的相关文章

预编译命令简单解释(转载)

我的blog是用开源的BlogEngine来架设的,有的时候为了满足自己的需求及要对源代码做一些修改.在我调试客户端代码的时候,不管是使用Firebug或者是Vs 2008来调试,看到的Javascript代码都是经过动态压缩过了的,这个系统有一个HttpHanddle是专门用来处理js文件请求的,在第一次请求的时候会对js代码进行压缩,去掉了注释换行符等不必要的字符,这样可以提高访问的速度,但是对调试非常的不利,相信我们谁都不愿意对着一堆压缩过了的JS代码做调试.于是我想到了C#的预编译指令,

javascript 对象简单解释

在javascript 中 数组是对象,函数是对象,正则表达式是对象,当然对象自然也是对象. 对象是属性的容器,每个属性都有名字和值,名字可以是包括空字符串在内的任意字符串,属性值是除undefined值之外的任何值. 若在对象中检索一个并不存在的成员变量值,将返回一个undefined值. 使用 || 运算符填充默认值: var middel = stooge["middle-name"] || "{none}" 尝试检索一个undefined值可能倒是typeE

简单解释一下正则化

解释之前,先说明这样做的目的:如果一个模型我们只打算对现有数据用一次就不再用了,那么正则化没必要了,因为我们没打算在将来他还有用,正则化的目的是为了让模型的生命更长久,把它扔到现实的数据海洋中活得好,活得久. 再简单解释一下正则化,以下内容来自PRML前三章,具体页数记不清了. 上图中的模型是线性回归,有两个特征,要优化的参数分别是w1和w2,左图的正则化是l2,右图是l1.蓝色线就是优化过程中遇到的等高线,一圈代表一个目标函数值,圆心就是样本观测值(假设一个样本),半径就是误差值,受限条件就是

static_cast 、const_cast、dynamic_cast、reinterpret_cast 关键字简单解释

static_cast .const_cast.dynamic_cast.reinterpret_cast 关键字简单解释: Static_cast 静态类型转换 ①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换. 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的: 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的. ②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum.这种转换的安全性也要开发人员来保

MongoDB中insert方法、update方法、save方法简单对比

MongoDB中insert方法.update方法.save方法简单对比 1.update方法 该方法用于更新数据,是对文档中的数据进行更新,改变则更新,没改变则不变. 2.insert方法 该方法用于插入数据到文档中,也就是给文档添加新数据. 3.save方法 该方法同样用于插入数据到文档中,功能是类似于insert方法的.与insert方法不同的是, save方法是遍历文档,逐条将数据插入进去的,而insert方法是将整个文档整体插入进去的. 由两个方法的源码可以看出来. save方法的写法

进程与线程的一个简单解释(转)

进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握. 最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂. 1. 计算机的核心是CPU,它承担了所有的计算任务.它就像一座工厂,时刻在运行. 2. 假定工厂的电力有限,一次只能供给一个车间使用.也就是说,一个车间开工的时候,其他车间都必须停工.背后的含义就是,单个CPU一次只能运行一个任务. 3. 进程就好比工厂的车间,它代表CPU所能处理的单个任务.任一时刻,CPU总是运行一个进程,其

简述JDBC原理 + 在JAVA中异常是什么 + throws 与 throw 区别 + 简单解释以下JAVA中的多态

JDBC原理: 加:加载驱动 链:创建连接 预:创建预编译 执:执行SQL语句(查询需要处理结果级) 释:关闭链接: DBC中定义了一些接口:  1.驱动管理:  DriverManager  2.连接接口  Connection  DatabasemetaData  3.语句对象接口  Statement  PreparedStatement  CallableStatement  4.结果集接口  ResultSet  ResultSetMetaData JDBC只定义接口,具体实现由各个数

极大似然估计思想的最简单解释

极大似然估计思想的最简单解释 https://blog.csdn.net/class_brick/article/details/79724660?from=timeline 极大似然估计法的理解可以从三个角度入手,一个是整体性的思想,然后两个分别是离散状态的极大似然估计和连续状态的极大似然估计的简单例子. 一.思想 极大似然估计可以拆成三个词,分别是"极大"."似然"."估计",分别的意思如下:极大:最大的概率似然:看起来是这个样子的估计:就是

KMP 算法简单解释

KMP 算法简单解释 ? 讲KMP算法,离不开BF,实际上,KMP就是BF升级版,主要流程和BF一样,就是在削除回溯上花了点功夫,利用Next数组来削除 <( ̄︶ ̄)[GO!] 1. 先看看BF算法(暴力破解) int Brute_force_1(const char *S, const char *T) { if (!S || !T) return -1; int lenS = strlen(S); int lenT = strlen(T); int i = 0; //主串下标索引 int j