/**

* 测试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()相关推荐

  1. Ceph cache tier 中 flush 和 evict 机制源码分析

    存储系统:ceph-14.2.22 操作系统:ubuntu-server-16.04.07 OSDService::agent_entry [ 文件路径 ] ceph/src/osd/OSD.cc O ...

  2. mysql reflush pri_Mysql Flush privileges命令的功能与使用

    flush privileges 命令本质上的作用是将当前user和privilige表中的用户信息/权限设置从mysql库(MySQL数据库的内置库)中提取到内存里.MySQL用户数据和权限有修改后 ...

  3. mysql bug frash_MySQL Flush导致的等待问题

    --MySQL Flush导致的等待问题 -------------------------------2014/07/13 前言 在实际生产环境中有时会发现大量的sql语句处于waiting for ...

  4. Mysql中的flush privileges语句

    flush privileges语句的作用: 就是将当前user表的用户信息和privilige表的权限设置从mysql库(就是mysql数据库的内置库)提取到内存里. 一般就是在修改用户信息或者权限 ...

  5. MySql数据库的flush

    InnoDB在处理更新语句的时候,只做了写日志这一个磁盘操作.这个日志叫作redo log(重做日志),也就是<孔乙己>里咸亨酒店掌柜用来记账的粉板,在更新内存写完redo log后,就返 ...

  6. mysql 刷新_MYSQL FLUSH 刷新缓存

    MYSQL当做了权限操作,新加用户,或者是其他表的操作后.要其生效有两种方式,一种是重启服务,另外一种是使用FLUSH命令.第二个方式,使用FLUSH必须有reload权限. 下面是FLUSH命令的主 ...

  7. mysql wait for flush,Mysql线程大量Wating For table flush问题分析

    早上8点种线上服务器大量报出以下异常 java.sql.SQLTransientConnectionException: MyHikariCP - Connection is not availabl ...

  8. mysql flush logs时出现ERROR 1105

    mysql 5.7.11 on Oracle Linux 5.8 查看eror log所在目录为 mysql> show variables like '%log_error%'; +----- ...

  9. mysql.err日志分析_Mysql日志解析

    转载:https://www.cnblogs.com/Fly-Wind/p/5674382.html 修改Mysql配置 Mysql配置地址为: C:\Program Files (x86)\MySQ ...

最新文章

  1. 深度学习初学者使用Keras构建和部署CNN模型
  2. java plugin 安装_eclipse maven plugin 插件 安装 和 配置
  3. java jackson json_java – 使用Jackson从JSON获取单个字段
  4. 虚函数和纯虚函数的区别
  5. docker中部署Nginx
  6. 超过200m文件发送_微信支持发送大文件了,高清视频不再压缩
  7. 开课啦! dubbo-go 微服务升级实战
  8. 在linux下dns绑定域名,在Linux系统中,使用Bind搭建DNS域名解析服务
  9. 自底向上——知识图谱构建技术初探
  10. PHP对数组的高级遍历和操作处理方法
  11. 死锁的充分必要条件、死锁预防、死锁避免、死锁检测和解除
  12. 前端开发神器:grunt快速入门
  13. python基础教程是什么-python基础教程之python是什么?
  14. java class getfields_JAVA反射中的getFields()方法和getDeclaredFields ()方法的区别
  15. 贴花纸怎么贴_地砖保护膜怎么贴—怎么贴地砖保护膜
  16. C#中打开Excel并刷新加载宏的方法
  17. 使用STVD和Cosmic C编译器开发STM8S快速入门指南
  18. Qt QPushButton水晶按钮样式例子
  19. Redis持久化中的AOF(Append Only File)持久化
  20. DC report_timing 报告分析(STA)

热门文章

  1. # 项目一:‍‍‍STM32+串口DMA+RS485+MODBUS+传感器实现SO2的测试
  2. Wix 软件打包(一)
  3. 好玩的-记最近玩的几个经典ipad ios游戏
  4. 《ZigBee开发笔记》第五部分 外设篇 - 基础实验 第3章 A - CC2530 MQ-2气体传感器
  5. postgresql 的 show create table 命令
  6. 蓝桥杯在哪下载准考证
  7. 字节(Byte)、位(bit)
  8. TX2+TensorRT+DIGITS实现图像的识别、检测和分割---3---图像识别(二)
  9. TortoiseGit添加忽略文件
  10. 解决关于mybatis-plus修改字段时会自动忽略值为null的字段