`
leo133845920
  • 浏览: 56366 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

session.flush与transaction.commit

    博客分类:
  • java
阅读更多
以session的save方法为例来看一个简单、完整的事务流程,如下是代码片段:
…………………………………………………………………………
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(customer);//之前已实例化好了的一个对象
tx.commit();
…………………………………………………………………………
示例很简单,就是向数据库中插入一条顾客信息,这是一个最简单的数据库事务。在这个简单的过程中,Hibernate为我们做了一些什么事情呢?为了更好的观察,我们将Hibernate的”show_sql”属性设置为true,然后运行我们的程序,控制台打印出如下信息:
Hibernate: select max(ID) from CUSTOMER
Hibernate: insert into CUSTOMER (NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED, description, BIRTHDAY, REGISTERED_TIME, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

这里也许看不出什么端倪来,现在在session.save(customer)后面加一行代码,输出这个customer的OID,System.out.println(customer.getId()),再次运行程序,控制台输出为:
Hibernate: select max(ID) from CUSTOMER
22
Hibernate: insert into CUSTOMER (NAME, EMAIL, PASSWORD, PHONE, ADDRESS, SEX, IS_MARRIED, description, BIRTHDAY, REGISTERED_TIME, ID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

OID在insert语句之前输出,这可以说明两个问题:1.insert语句并不是在执行save的时候发送给数据库的;2.insert语句是在执行commit的时候发送给数据库的。结合前面我们所说过的:执行save的时候,Hibernate会首先把对象放入缓存,然后计划一条insert语句。一个基本的插入流程就出来了:
1.  判断所要保存的实例是否已处于持久化状态,如果不是,则将其置入缓存;
2.  根据所要保存的实例计划一条insert sql语句,注意只是计划,并不执行;
3.  事务提交时执行之前所计划的insert语句;
后台还打印出了select max(ID) from CUSTOMER,这主要是为了给customer赋予一个OID,因为一般情况下临时对象的OID是NULL。
接着我们做两个测试:
1.  将tx.commit();注释掉,此时控制台没有打印出insert语句;
2.  将tx.commit()换成session.flush,此时控制太打印出了insert语句,但是数据库中并没有添加新的记录;
通过查阅Hibernate的API可以知道flush方法的主要作用就是清理缓存,强制数据库
与Hibernate缓存同步,以保证数据的一致性。它的主要动作就是向数据库发送一系列的sql语句,并执行这些sql语句,但是不会向数据库提交。而commit方法则会首先调用flush方法,然后提交事务。这就是为什么我们仅仅调用flush的时候记录并未插入到数据库中的原因,因为只有提交了事务,对数据库所做的更新才会被保存下来。因为commit方法隐式的调用了flush,所以一般我们都不会显示的调用flush方法。
分享到:
评论

相关推荐

    hibernate的session.flush

    博文链接:https://llying.iteye.com/blog/221702

    hibernate的flush()、refresh()、clear()针对一级缓存的操作的区别.docx

    1 session.flush()的作用就是将session的缓存中的数据与数据库同步。 2 session.clear()的作用就是清除session中的缓存数据(不管缓存与数据库的同步)。 3.session.refresh():会强制发送select语句,以使session...

    Hibernate查询语言

    14.1. 批量插入(Batch inserts) 如果要将很多对象持久化,你必须通过经常的调用 flush() 以及稍后调用 clear() 来控制第一级缓存的大小。...tx.commit(); session.close(); 14.2. 批量更新(Batch updates)

    通过Response.Flush()实现下载失败的解决方法

    Response.Flush()实现对服务端文件的下载时,会失败,不能正常弹出IE下载框,通过测试发现时浏览器的安全设置问题,如下操作便可解决

    Response.Flush的使用心得

    此时我们就会用到Response.flush()。他会将缓冲区中编译完成的数据先发送到客户端。 但是有很多时候,我们发现即使我们使用了Response.Flush(),但是并没有将前面的信息发到客户端来显示。呈献给我们的依然是白屏。...

    asp Response.flush 实时显示进度

    如果你知道Response.Flush和Response.Clear,那你就可以不用这样的等待了。每生成一个Html页面,就用Response.write立即返回一条信息,提示该条数据库记录已经生成Html。

    hibernate的flush机制

    对hibernate的flush机制有兴趣可以看看

    hibernate执行原生sql语句

    session.flush(); return null; } }); } ``` 在上面的代码中,我们使用 `HibernateCallback` 接口来执行原生 SQL 语句,该接口提供了一个 `doInHibernate()` 方法,该方法将在 Hibernate 事务中执行。我们可以在...

    通过HttpURLConnection获取SESSIONID

    out.flush(); out.close(); out.write(parameters.getBytes(),0,parameters.getBytes().length); InputStream in = hc.getInputStream(); InputStreamReader reader = new InputStreamReader(in,"gb...

    Hibernate的Session_flush与隔离级别代码详解

    主要介绍了Hibernate的Session_flush与隔离级别代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    FileCopy.zip

    FormerOpen.Flush(); //清空缓存 ToFileOpen.Write(buffer, 0, (int)FormerOpen.Length); //写入字节 ToFileOpen.Flush(); //清空缓存 FormerOpen.Close(); //释放所有资源 ...

    记录模型训练时loss值的变化情况

    sys.stdout.flush() if verbose: sys.stdout.write('\r') sys.stdout.flush() 一般我们在训练神经网络模型的时候,都是每隔多少步,输出打印一下loss或者每一步打印一下loss,今天发现了另一种记录loss变化的...

    MySQL-Flush命令用法.docx#资源达人分享计划#

    MySQL Flush 命令用法详解 MySQL Flush 命令是 MySQL 中的一种非常重要的命令,它可以用于清除或重新加载各种高速缓存、表或者获取锁等。执行 Flush 命令必须要有 reload 权限。今天,我们将详细介绍 MySQL Flush ...

    handleStream ServletOutputStream out = response.getOutputStream(); InputStream i

    NULL 博文链接:https://nethub2.iteye.com/blog/2023937

    新鲜出炉的PCI-E协议3.0

    1.5.1. Transaction Layer................................................................................................. 44 1.5.2. Data Link Layer ......................................................

    安卓动态分析平台droidbox

    可以用于安全地观察APK包的行为,具体使用方法参见官网http://code.google.com/p/droidbox/

    hibernate操作数据库笔记

    Session对象.beginTransaction().begin(); //开始一个事务 4.用Session对象的以下方法操作数据 (1).save(Object obj); (2).saveOrUpdate(Object obj); (3).delete(Object obj); //只要删除的对象设置了主键的值...

    MD5加密解密

    MD5 加密 解密 public string EnCode(string data) { byte[] byKey = System.Text.... sw.Flush(); cst.FlushFinalBlock(); sw.Flush(); return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length); }

Global site tag (gtag.js) - Google Analytics