mysql evict_Hibernate的flush()和evict()
/**
* 测试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);
}
}
Hibernate的flush机制:http://sind.iteye.com/blog/255429
分享到:
2009-03-05 01:49
浏览 7992
评论
mysql evict_Hibernate的flush()和evict()相关推荐
- Ceph cache tier 中 flush 和 evict 机制源码分析
存储系统:ceph-14.2.22 操作系统:ubuntu-server-16.04.07 OSDService::agent_entry [ 文件路径 ] ceph/src/osd/OSD.cc O ...
- mysql reflush pri_Mysql Flush privileges命令的功能与使用
flush privileges 命令本质上的作用是将当前user和privilige表中的用户信息/权限设置从mysql库(MySQL数据库的内置库)中提取到内存里.MySQL用户数据和权限有修改后 ...
- mysql bug frash_MySQL Flush导致的等待问题
--MySQL Flush导致的等待问题 -------------------------------2014/07/13 前言 在实际生产环境中有时会发现大量的sql语句处于waiting for ...
- Mysql中的flush privileges语句
flush privileges语句的作用: 就是将当前user表的用户信息和privilige表的权限设置从mysql库(就是mysql数据库的内置库)提取到内存里. 一般就是在修改用户信息或者权限 ...
- MySql数据库的flush
InnoDB在处理更新语句的时候,只做了写日志这一个磁盘操作.这个日志叫作redo log(重做日志),也就是<孔乙己>里咸亨酒店掌柜用来记账的粉板,在更新内存写完redo log后,就返 ...
- mysql 刷新_MYSQL FLUSH 刷新缓存
MYSQL当做了权限操作,新加用户,或者是其他表的操作后.要其生效有两种方式,一种是重启服务,另外一种是使用FLUSH命令.第二个方式,使用FLUSH必须有reload权限. 下面是FLUSH命令的主 ...
- mysql wait for flush,Mysql线程大量Wating For table flush问题分析
早上8点种线上服务器大量报出以下异常 java.sql.SQLTransientConnectionException: MyHikariCP - Connection is not availabl ...
- mysql flush logs时出现ERROR 1105
mysql 5.7.11 on Oracle Linux 5.8 查看eror log所在目录为 mysql> show variables like '%log_error%'; +----- ...
- mysql.err日志分析_Mysql日志解析
转载:https://www.cnblogs.com/Fly-Wind/p/5674382.html 修改Mysql配置 Mysql配置地址为: C:\Program Files (x86)\MySQ ...
最新文章
- 深度学习初学者使用Keras构建和部署CNN模型
- java plugin 安装_eclipse maven plugin 插件 安装 和 配置
- java jackson json_java – 使用Jackson从JSON获取单个字段
- 虚函数和纯虚函数的区别
- docker中部署Nginx
- 超过200m文件发送_微信支持发送大文件了,高清视频不再压缩
- 开课啦! dubbo-go 微服务升级实战
- 在linux下dns绑定域名,在Linux系统中,使用Bind搭建DNS域名解析服务
- 自底向上——知识图谱构建技术初探
- PHP对数组的高级遍历和操作处理方法
- 死锁的充分必要条件、死锁预防、死锁避免、死锁检测和解除
- 前端开发神器:grunt快速入门
- python基础教程是什么-python基础教程之python是什么?
- java class getfields_JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别
- 贴花纸怎么贴_地砖保护膜怎么贴—怎么贴地砖保护膜
- C#中打开Excel并刷新加载宏的方法
- 使用STVD和Cosmic C编译器开发STM8S快速入门指南
- Qt QPushButton水晶按钮样式例子
- Redis持久化中的AOF(Append Only File)持久化
- DC report_timing 报告分析(STA)
热门文章
- # 项目一:STM32+串口DMA+RS485+MODBUS+传感器实现SO2的测试
- Wix 软件打包(一)
- 好玩的-记最近玩的几个经典ipad ios游戏
- 《ZigBee开发笔记》第五部分 外设篇 - 基础实验 第3章 A - CC2530 MQ-2气体传感器
- postgresql 的 show create table 命令
- 蓝桥杯在哪下载准考证
- 字节(Byte)、位(bit)
- TX2+TensorRT+DIGITS实现图像的识别、检测和分割---3---图像识别(二)
- TortoiseGit添加忽略文件
- 解决关于mybatis-plus修改字段时会自动忽略值为null的字段