`

hibernate基础-Session_Flush

阅读更多

session flush测试:

session flush方法主要做了两件事:
1 清理缓存
2 执行sql(不是提交事务)

session在什么情况下执行flush
1 默认在事务提交时
2 显式的调用flush
3 在执行查询前,如:iterate

hibernate按照save(insert),update,delete顺序提交相关的操作
------------------------------------------------------------------------

  <id name="id">
   <generator class="uuid"/>
  </id>
  因为id的主键生成策略采用的是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后数据无法回滚
  session.getTransaction().commit();
  
  <id name="id">
   <generator class="native"/>
  </id>
  如果id的主键生成策略采用的是native,调用save(user)时会发出insert语句,返回由数据库生成的id,
  user对象纳入到session的管理,session中existsInDatebase状态为true
-----------------------------------------------------------------
  <id name="id">
   <generator class="uuid"/>
  </id>
  session.save(user);
  将user对象从session中逐出,即session的EntiryEntries属性中逐出
  session.evict(user);//清理缓存
  无法成功提交,因为hibernate在清理缓存时,在session的insertions集合中取出user对象进行insert操作后
  需要更新entityEntries属性中的existsnDatabase为true,而我们采用evict已经将user从session中
  逐出了,所以找不到相关数据,无法更新,抛出异常
  session.getTransaction().commit();
----------------------------------------------------------------
  <id name="id">
   <generator class="uuid"/>
  </id>
  session.save(user);
  flush后hibernate会清理缓存,会将user对象保存到数据库中,将session中的insertions中的user
  清除,并且设置session中existsInDatabase的状态为true
  session.flush(user);
  将user对象从session中逐出,即session的EntityEntries属性中逐出
  session.evict(user);//清理缓存
  可以成功提交,因为hibernate在清理缓存时,在session的insertions集合中无法找到user对象
  所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态
  session.getTransaction().commit();
-----------------------------------------------------------------
  <id name="id">
   <generator class="native"/>
  </id>
  session.save(user);
  将user对象从session中逐出,即session的EntityEntries属性中逐出
  session.evict(user);//清理缓存
  可以成功提交,因为hibernate在清理缓存时,在session的insertions集合中无法找到user对象
  所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态
  session.getTransaction().commit();
-----------------------------------------------------------------
    <id name="id">
   <generator class="assigned"/>
  </id>
  session.save(user);
  user.setName("张三");
  session.update(user);
  User user2=new User();
  user2.setId("003");
  user2.setName("李四");
  session.getTransaction().commit();
  结果:
  insert into ...
  insert into ...
  update t_user ...
  hibernate按照save(insert),update,delete顺序提交相关的操作
-----------------------------------------------------------------
   <id name="id">
   <generator class="assigned"/>
  </id>
  session.save(user);
  user.setName("张三");
  session.update(user);
  因为我们在session.update(user)后执行了flush,所以在以commit清理缓存时执行flush前的sql就不会发出.
  session.flush();//在这里flush操作就可以了
  
  User user2=new User();
  user2.setId("003");
  user2.setName("李四");
  session.getTransaction().commit();
  结果:
  insert into ...
  update t_user ...
  insert into ...
  按照我们想要顺序save(insert),update,save(insert)的顺序提交操作
-----------------------------------------------------------------

分享到:
评论

相关推荐

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

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

    hibernate的session.flush

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

    hibernate学习笔记

    session flush测试(hibernate_session_flush) 12 hihernate一对多关联映射(单向Classes-----&gt;Student) 13 hihernate一对多关联映射(双向Classes&lt;-----&gt;Student)(常用) 14 hibernate一对多双向自连接关联映射...

    Hibernate学习笔记

    013 session_flush 014 一对多关联映射 单向 015 一对多关联映射 双向 016 多对多关联映射 单向 017 多对多关联映射 双向 018 关联映射文件中标签中的 lazy(懒加载)属性 019 关联映射文件中集合标签中的 lazy(懒加载...

    hibernate基础教程

    3、批量存储:session.flush()和session.clear() 二 Hibernate中的二级缓存结构 在Hibernate中使用两极缓存结构,第一级缓存是Session级别的缓存,Session级别的缓存是由Hibernate...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 ...

    hibernate.properties

    #hibernate.transaction.flush_before_completion ## Enable automatic session close at the end of transaction ## (This setting is relevant with or without the Transaction API) #hibernate.transaction....

    Hibernate的事务处理机制和flush方法的用法.docx

    关于在使用 hibernate 在提交事务时常遇到的异常: ...其实这个异常一般都是和我们在操作session flush方法和提交事务过程中会抛出的,下面就具体结合session的事务和声明周期来具体分析下,为什么会有这样的异常;

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

    session.flush()和session.clear()就针对session的一级缓存的处理。 简单的说, 1 session.flush()的作用就是将session的缓存中的数据与数据库同步。 2 session.clear()的作用就是清除session中的缓存数据(不管缓存...

    hibernate3.2中文文档(chm格式)

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 ...

    HibernateAPI中文版.chm

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 ...

    hibernate操作数据库笔记

    Session对象.flush(); //将Session中的缓存内容提交到数据库 Session对象.clear(); //清空Session中的所有缓存(彻底清除会话) Session对象.beginTransaction().begin(); //开始一个事务 4.用Session对象的以下...

    hibernate总结

    ii. Session.flush(); 4. 管理session一级缓存的方法 a) Session.evict(obj)从session的一级缓存中移出一个对象 b) Session.clear() 将一级缓存中的所有对象全部清空 c) Session.close() 关闭一个session 对象的...

    Hibernate+中文文档

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 ...

    Hibernate使用技巧汇总

    session.Flush() 强制数据库立即同步,当用事务时,不必用flush,事务提交自动调用flush 在session关闭时也会调用flush &lt;br&gt;4. Hibernate总是使用对象类型作为字段类型 5. XDoclet专门建立了...

    hibernate 教程

    同步(Flush) Session 9.7.2. 提交数据库事务 9.7.3. 关闭Session 9.7.4. 处理异常 9.8. 生命周期和对象图(Lifecyles and object graphs) 9.9. 拦截器(Interceptors) 9.10. 元数据(Metadata) API...

    Hibernate中文详细学习文档

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 ...

    Hibernate 中文 html 帮助文档

    10.10. Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 11.1.3. ...

    Hibernate查询语言

    14.1. 批量插入(Batch inserts) 如果要将很多对象持久化,你必须通过经常的调用 flush() 以及稍后调用 ...session.flush(); session.clear(); } } tx.commit(); session.close(); 14.2. 批量更新(Batch updates)

    hibernate 体系结构与配置 参考文档(html)

    Session刷出(flush) 10.11. 传播性持久化(transitive persistence) 10.12. 使用元数据 11. 事务和并发 11.1. Session和事务范围(transaction scope) 11.1.1. 操作单元(Unit of work) 11.1.2. 长对话 11.1.3. ...

Global site tag (gtag.js) - Google Analytics