[SXT][WY]Hibernate06 Session Flush

2024-01-25 19:48
文章标签 session flush wy sxt hibernate06

本文主要是介绍[SXT][WY]Hibernate06 Session Flush,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

session flush测试:

session flush方法主要做了两件事:
 * 清理缓存 // 注意!:一个对象在session中保存有两份。一份是临时的用于生成sql语句的,一份是持久的。

                   // flush只是清理了那个临时的对象,不清理持久的

                   // evict是清理持久的,不清理临时的。
 * 执行sql    // 执行完后,持久的那份对象有一个existsInDatabase的boolean值由false变为true
 
session在什么情况下执行flush
 * 默认在事务提交时
 * 显示的调用flush
 * 在执行查询前,如:iterate
 
hibernate按照save(insert),update、delete顺序提交相关操作 

 

脏读:读没有commit的数据

可重复读:读出‘张三’,刷新后,还是‘张三’。既数据不能在被读出时被其他用户更新。

幻读:查询年龄大于30的人,得到10个。刷新后,人数变为20个人。既数据在此期间被插入若干条。

 

/**
  * 测试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);
  }
 }  

这篇关于[SXT][WY]Hibernate06 Session Flush的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/644410

相关文章

SIGMOD-24概览Part7: Industry Session (Graph Data Management)

👇BG3: A Cost Effective and I/O Efficient Graph Database in ByteDance 🏛机构:字节 ➡️领域: Information systems → Data management systemsStorage management 📚摘要:介绍了字节新提出的ByteGraph 3.0(BG3)模型,用来处理大规模图结构数据 背景

flask-login 生成 cookie,session

flask-login 生成 cookie,session Flask-Login login_user() 显示来自 Set-Cookie 标头的加密 cookie # 模拟一个用户类class User(UserMixin):def __init__(self, id):self.id = id@app.route('/login')def login():# 模拟用户登录过程user

Session用法详解

本文引用http://www.accdb.net/article.asp?id=1115 阅读本文章之前的准备   阅读本文章前,需要读者对以下知识有所了解。否则,阅读过程中会在相应的内容上遇到不同程度的问题。   懂得ASP/ASP.NET编程    了解ASP/ASP.NET的Session模型    了解ASP.NET Web应用程序模型    了解ASP.N

报错:Reached the max session limit(DM8 达梦数据库)

报错:Reached the max session limit - - DM8 达梦数据库 1 环境介绍2 数据库启动SYSTEM IS READY后面日志3 数据库刚启动日志4 达梦数据库学习使用列表 1 环境介绍 某项目无法连接数据库,报错:超过最大会话数限制 , 检查 dmdba ulimit -a openfiles 已改检查 dm.ini 其中 MAX_SESSION

Requests库对session的支持

场景:如何获取登录时响应消息中的sessionid,以及如何在后续请求中把sessionid添到cookie中 Requests库提供了一个Session类,通过requests库中的session对象,requests库会自动帮我们保存服务端返回的cookie数据(set-cookie里的内容),也会在HTTP发出请求时自动在消息头中放入cookie数据。 用py模拟客户端接收响应消息:

Flask-Session扩展,使用Redis存储会话数据

深入理解Flask-session扩展Redis Flask 应用中使用 flask-session 扩展将 session 数据存储在 Redis 中是一种高效且可扩展的方法,特别是在需要处理大量用户或需要分布式部署的应用中。以下是如何在 Flask 应用中配置 flask-session 以使用 Redis 存储 session 的步骤: 1. 安装必要的库 首先,你需要安装 Flask

浏览器百科:网页存储篇-Session storage应用实例(九)

1.引言 在前面的文章中,我们详细介绍了如何在 Chrome 浏览器中打开并使用 Session storage 窗格,进行数据的查看、编辑和管理。作为网页存储技术的重要组成部分,sessionStorage在提升用户体验和数据管理能力方面发挥了重要作用。在本篇《浏览器百科:网页存储篇-Session storage应用实例(九)》中,我们将深入探讨sessionStorage的实际应用场景,通

springboot 联合redis实现session共享springsession (springMVC的在上一篇) [二〇一八年十一月十四日]]

1创建springboot工程: 这个就不bb了, 不过我只能用main方法跑, 用tomcat跑回报一个redis的getConfig异常, 不管了 2引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-redis</artifactId><version>1.

spring 配置spring-session+redis共享 涉及nginx+redis知识 (二〇一八年十一月十二日 )

前提: 单实例的工程下, session是一个非常好用的对象, 因为session属于服务器端, 而且对于用户(浏览器)来说是唯一的 但是针对集群(今天大拿跟我说了下集群和分布式的概念)来说的话, session共享就变得极其重要,因为session是属于服务器端的, 服务器A有session, 但是服务器B拿session是拿不到的 废话不多说, 开始上代码. 总共分三步: 第一步: 首先

关于cookie和session的直观讲解(二)

前言 上一章,讲解了Cookie,本章介绍Session. 概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中HttpSession。 Session 基础 获取HttpSession对象: HttpSession session = request.getSession(); 使用HttpSession对象: Object getAttribute