- 浏览: 82343 次
- 性别:
- 来自: 上海
文章分类
最新评论
session flush方法主要做了两件事:
* 清理缓存
* 执行sql
session在什么情况下执行flush
* 默认在事务提交时
* 显示的调用flush
* 在执行查询前,如:iterate
hibernate按照save(insert),update、delete顺序提交相关操作
* 清理缓存
* 执行sql
session在什么情况下执行flush
* 默认在事务提交时
* 显示的调用flush
* 在执行查询前,如:iterate
hibernate按照save(insert),update、delete顺序提交相关操作
/** * 测试uuid主键生成策略 */ public void testSave1() { Session session = null; Transaction tx = null; try { session = HibernateUtils.getSession(); tx = session.beginTransaction(); User1 user = new User1(); user.setName("李四"); user.setPassword("123"); user.setCreateTime(new Date()); user.setExpireTime(new Date()); //因为user的主键生成侧路采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理 //不会发出insert语句,但是id已经生成,session中existsInDatebase状态为false session.save(user); //调用flush,hibernate会清理缓存,执行sql //如果数据库的隔离级别设置为为提交读,那么我们可以看到flush过的数据 //并且session中existsInDatebase状态为true session.flush(); //提交事务 //默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush //commit后数据是无法回滚的 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 测试native主键生成策略 */ public void testSave2() { Session session = null; Transaction tx = null; try { session = HibernateUtils.getSession(); tx = session.beginTransaction(); User2 user = new User2(); user.setName("张三1"); user.setPassword("123"); user.setCreateTime(new Date()); user.setExpireTime(new Date()); //因为user的主键生成策略为native,所以调用session.save后,将执行insert语句,返回有数据库生成的id //纳入了session的管理,修改了session中existsInDatebase状态为true //如果数据库的隔离级别设置为为提交读,那么我们可以看到save过的数据 session.save(user); tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 测试uuid主键生成策略 */ public void testSave3() { Session session = null; Transaction tx = null; try { session = HibernateUtils.getSession(); tx = session.beginTransaction(); User1 user = new User1(); user.setName("王五"); user.setPassword("123"); user.setCreateTime(new Date()); user.setExpireTime(new Date()); //因为user的主键生成侧路采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理 //不会发出insert语句,但是id已经生成,session中existsInDatebase状态为false session.save(user); //将user对象从session中逐出,即session的EntityEntries属性中逐出 session.evict(user); //无法成功提交,因为hibernate在清理缓存时,在session的insertions集合中取出user对象进行insert操作后 //需要更新entityEntries属性中的existsInDatabase为true,而我们采用evict已经将user从session的entityEntries //中逐出了,所以找不到相关数据,无法更新,抛出异常 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 测试uuid主键生成策略 */ public void testSave4() { Session session = null; Transaction tx = null; try { session = HibernateUtils.getSession(); tx = session.beginTransaction(); User1 user = new User1(); user.setName("王五"); user.setPassword("123"); user.setCreateTime(new Date()); user.setExpireTime(new Date()); //因为user的主键生成侧路采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理 //不会发出insert语句,但是id已经生成,session中existsInDatebase状态为false session.save(user); //flush后hibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user对象 //清除,并且设置session中existsInDatebase的状态为true session.flush(); //将user对象从session中逐出,即session的EntityEntries属性中逐出 session.evict(user); //可以成功提交,因为hibernate在清理缓存时,在session的insertions集合中无法找到user对象 //所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 测试native主键生成策略 */ public void testSave5() { Session session = null; Transaction tx = null; try { session = HibernateUtils.getSession(); tx = session.beginTransaction(); User2 user = new User2(); user.setName("张三11"); user.setPassword("123"); user.setCreateTime(new Date()); user.setExpireTime(new Date()); //因为user的主键生成策略为native,所以调用session.save后,将执行insert语句,返回有数据库生成的id //纳入了session的管理,修改了session中existsInDatebase状态为true //如果数据库的隔离级别设置为为提交读,那么我们可以看到save过的数据 session.save(user); //将user对象从session中逐出,即session的EntityEntries属性中逐出 session.evict(user); //可以成功提交,因为hibernate在清理缓存时,在session的insertions集合中无法找到user对象 //所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 测试assigned主键生成策略 * */ public void testSave6() { Session session = null; Transaction tx = null; try { session = HibernateUtils.getSession(); tx = session.beginTransaction(); User3 user = new User3(); user.setId("001"); user.setName("张三"); session.save(user); user.setName("王五"); session.update(user); User3 user3 = new User3(); user3.setId("002"); user3.setName("李四"); session.save(user3); //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?) //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?) //Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=? //hibernate按照save(insert),update、delete顺序提交相关操作 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); }finally { HibernateUtils.closeSession(session); } } /** * 测试assigned主键生成策略 * */ public void testSave7() { Session session = null; Transaction tx = null; try { session = HibernateUtils.getSession(); tx = session.beginTransaction(); User3 user = new User3(); user.setId("003"); user.setName("张三"); session.save(user); user.setName("王五"); session.update(user); session.flush(); User3 user3 = new User3(); user3.setId("004"); user3.setName("李四"); session.save(user3); //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?) //Hibernate: update t_user3 set name=?, password=?, create_time=?, expire_time=? where user_id=? //Hibernate: insert into t_user3 (name, password, create_time, expire_time, user_id) values (?, ?, ?, ?, ?) //因为我们在session.udpate(user)后执行了flush,所以在清理缓存时执行flush前的sql不会生成 //sql会按照我们的意愿执行 tx.commit(); }catch(Exception e) { e.printStackTrace(); tx.rollback(); }finally { HibernateUtils.closeSession(session); } }
发表评论
-
Fetch抓取策略
2008-12-21 15:30 10251 hibernate抓取策略(单端代理的批量抓取) 保持默 ... -
查询缓存
2008-12-21 13:27 2498查询缓存是针对普通属性结果集的缓存,对实体对象的结果集只缓存i ... -
二级缓存
2008-12-21 09:55 802二级缓存也称进程级的缓存或SessionFactory级的缓存 ... -
一级缓存
2008-12-20 21:18 825一级缓存很短和session的生命周期一致,一级缓存也叫ses ... -
HQL 原生SQL查询 外置命名查询 查询过滤器 DML风格的查询
2008-12-20 15:04 1269在hql中关键字不区分大小写,但是属性和类名区分大小写 1、简 ... -
冬夜读书示子律
2008-12-19 16:11 778古人学问无遗力,少壮功夫老始成。 纸上得来终觉浅,绝知此事要躬 ... -
悲观锁与乐观锁
2008-12-19 15:49 734悲观锁 悲观锁的实现,通常依赖于数据库机制,在整个过程中将数据 ... -
Set Map Arrary List 集合映射
2008-12-19 14:50 828<class name="com.bjsxt. ... -
composite 映射
2008-12-19 10:48 747通常将复合主键相关的属性,单独放到一个类中 * 此类必须实现序 ... -
Component 映射
2008-12-19 09:54 657在hibernate中,component是某个实体的逻辑组成 ... -
继承映射
2008-12-18 21:05 832继承映射分为三种: 1 单表继承:每颗类继承树使用一个表(ta ... -
LAZY策略
2008-12-18 14:26 719hibernate lazy策略可以使用在: * <cl ... -
Many-to-Many
2008-12-18 10:36 761hibernate多对多关联映射(单向User----> ... -
one-to-many
2008-12-17 20:19 1036hihernate一对多关联映射 ... -
数据库隔离级别
2008-12-17 13:57 793隔离级别 脏读 不可重复读 幻读 R ... -
One-to-one( 2 唯一外键关联)
2008-12-17 11:12 892hibernate一对一唯一外键关联映射(单向关联Person ... -
one-to-one(1主键关联)
2008-12-16 20:23 1744主键关联-----单向 <class name=&qu ... -
many-to-one
2008-12-16 20:15 731<class name="com.bjsx ... -
Hibernate3包问题org/slf4j/impl/StaticLoggerBinder
2008-12-15 13:55 4240Exception in thread "main& ...
相关推荐
主要讲解hibernate中flush()和evict()的用处
:bottle_with_popping_cork: :bottle_with_popping_cork: :bottle_with_popping_cork: :rocket: :rocket: :rocket: Webpack 4演示更新正在进行中现在支持Webpack 4积极的代码拆分我们更新了webpack-flush-chunks以...
MySQL-Flush命令用法.docx#资源达人分享计划#
this is a i/o flush code running on windows
MN10300 CPU core caching routines, using indirect regs on cache controller.
flush-reload :攻击工具,包括: flush-reload/original-from-authors :原始作者对Flush + Reload的实现。 flush-reload/myversion :我对Flush + Reload攻击工具的重写。 flush-reload/myversion/ruby :高级...
博文链接:https://llying.iteye.com/blog/221702
Functions to sequence FLUSH and FUA writes driver for Linux
Symbol Timing Tracking Using Early-Late Techniques by matlab
flash-plugin-11.2.202.438-release.x86_64.rpm
java -jar target / bug-zstd-partial-flush-benchmark.jar 输出量 全部-串联的所有文件的完整输出-每个文件的部分帧刷新-每个文件的单独压缩器 记录大小 original, size=284583 gzipFull, size=56075 gzipPart, ...
poker-player-royal-flush
var alcoholFlushReaction = require ( 'genoset-alcohol-flush-reaction' ) ; var fs = require ( 'fs' ) ; var path = require ( 'path' ) ; var es = require ( 'event-stream' ) ; var JSONStream = require ( ...
poker-royal-flush
部署Helix Cache Flush Service需要wsk命令行客户端,并已根据您选择的名称空间进行身份验证。对于Project Helix,我们使用helix名称空间。 通过测试的所有对main的提交将自动部署。所有将通过测试的分支提交都将被...
Write back the dirty D-caches, but not invalidate them.
字节节点 用于Node.js的极简字节码编译器。 该工具可将JavaScript代码真正... 在最新版本的Node中,必须设置--no-flush-bytecode 。 Bytenode在内部进行设置,但是如果遇到任何问题,请尝试使用以下标志运行Node: $
session.flush()和session.clear()就针对session的一级缓存的处理。 简单的说, 1 session.flush()的作用就是将session的缓存中的数据与数据库同步。 2 session.clear()的作用就是清除session中的缓存数据(不管缓存...
const flushPromises = require ( 'flush-promises' ) ; test ( 'flushPromises' , async ( ) => { let a ; let b ; Promise . resolve ( ) . then ( ( ) => { a = 1 ; } ) . then ( ( ) => { b = 2 ; } ) ...