`

Hibernate中session的clear(),flush(),evict()方法详解

阅读更多

一、Clear 方法

无论是Load 还是 Get 都会首先查找缓存(一级缓存) 如果没有,才会去数据库查找,调用Clear() 方法,可以强制清除Session缓存。例:

  1. publicvoid testClear(){
  2. Session session =HibernateUitl.getSessionFactory().getCurrentSession();
  3. session.beginTransaction();
  4. Teacher t =(Teacher) session.get(Teacher.class,3);
  5. System.out.println(t.getName());
  6. session.clear();//这里不clear只会执行一次sql语句,有clear会执行2次
  7. Teacher t2 =(Teacher) session.get(Teacher.class,3);
  8. System.out.println(t2.getName());
  9. session.getTransaction().commit();
  10. }

二、Flush 方法

可以强制进行从内存到数据库的同步。例:

  1. publicvoid testFlush(){
  2. Session session =HibernateUitl.getSessionFactory().getCurrentSession();
  3. session.beginTransaction();
  4. Teacher t =(Teacher) session.get(Teacher.class,3);
  5. t.setName("yyy");
  6. session.flush();//有flush会执行2次UPDAE,没有会只执行一次
  7. t.setName("yyyyy");
  8. session.getTransaction().commit();
  9. }

Flush方法是可以设置的,也就是 fulsh 什么时候执行是可以设置的,在session.beginTransaction 前设置 FlushMode

  1. session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL);

这里 FlushMode 有 5 个值可选

Always: 任何代码都会 Flush

AUTO: 默认方式 – 自动

Commit: COMMIT 时

Never: 始终不

MANUAL: 手动方式

设置 FlushMode 有个好处是可以节省开销,比如默认 session 只做查询时,就可以不让他与数据库同步了。

三、Evict 方法

会把指定的缓冲对象进行清除,而 Clear 方法则是把缓冲区内的全部对象清除,但不包括操作中的对象。

注意事项: Flush 方法和 Evict 方法一起使用出现的问题

Flush 方法和 Evict 方法一起使用出现的时候,一定要注意使用的顺序,否知会出现异常。下面的代码就是正确的使用顺序:

  1. //因为user的主键生成策略采用的是uuid,所以调用完成save后,
  2. //只是将user纳入到了session的管理
  3. //不会发出insert语句,但是id已经生成,session中existsInDatebase状态为false
  4. session.save(user);
  5.  
  6. //flush后hibernate会清理缓存,会将user对象保存到数据库中
  7. //(强制更新数据库,结果但不一定,因为commit时候可能会出现事物回滚)
  8. //并且设置session中existsInDatebase的状态为true
  9. session.flush();
  10.  
  11. //将user对象从session中逐出,即session的EntityEntries属性中逐出,一般调用前必须保证该实体与
  12. //数据库相关属性一致,即调用之前执行flush()方法。
  13. session.evict(user);
  14.  
  15. //可以成功提交,因为hibernate在清理缓存时,
  16. //在session的insertions集合中无法找到user对象
  17. //所以就不会发出insert语句,也不会更新session中的existsInDatabase的状态
  18. tx.commit();

 

注意: 凡是在数据库集群环境中,最好每个对象都调用evict()方法让其变成游离态,这样才会出现异常,

分享到:
评论

相关推荐

    hibernate的session.flush

    `Session.flush()`方法是一个关键的操作,它强制Hibernate将内存中的对象状态同步到数据库,确保数据的一致性。这篇博客深入探讨了`Session.flush()`的工作原理和应用场景。 `Session`在Hibernate中主要有以下职责...

    Hibernate中get和load方法的区别以及close(),clear()、evict()等的区别

    - **clear**:`clear`方法用于清除Session中的所有对象和缓存,这将使得Session回到初始状态,不再跟踪任何对象。这对于释放内存资源或开始新的独立操作非常有用。 - **evict**:`evict`方法用于从Session中移除...

    关于flush和evict

    `flush()`方法的主要作用是在不等待事务结束的情况下,强制将Session中的所有更改同步到数据库中。这包括但不限于插入、更新或删除操作。值得注意的是,虽然`flush()`会将更改写入数据库,但这些更改并不会立即成为...

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

    Hibernate的Session_flush与隔离级别代码详解 Hibernate 是一个基于Java的 ORM(Object-Relational Mapping)工具,提供了将 Java 对象映射到关系数据库的能力。其中 Session_flush 和隔离级别是两个重要的概念。 ...

    hibernate中evict()和clear()的区别.docx

    然而,一旦对象被evict,Session就不再跟踪该对象的任何变化,如果之后尝试更新或删除这个对象,Hibernate将无法识别它,除非再次加载到Session中。 相反,`session.clear()`方法是清除整个Session缓存,包括所有的...

    hibernate的flush机制

    在这个例子中,开发者试图通过调用`evict()`方法将`cat`对象从Session中拆离,然后提交事务。然而,由于`evict()`操作将`cat`从`entityEntries`中移除,但在事务提交时(即Flush操作时),Hibernate无法找到`cat`...

    Hibernate_Session_Transaction

    在Java的持久化框架Hibernate中,`Session`和`Transaction`是两个至关重要的概念,它们在数据管理和事务处理中起到核心作用。这篇文章将深入解析这两个概念及其相关知识点。 `Session`是Hibernate提供的一种与...

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

    1. 在事务中,如果先调用了`evict`方法移除对象,然后尝试提交事务,由于对象已经从缓存中移除,Hibernate无法找到对应的数据库记录进行更新,从而抛出异常。 2. 当执行了多个对象的插入或更新操作,没有在每个操作...

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

    1. `session.flush()`: 这个方法的主要作用是将Session缓存中的改动同步到数据库中。在默认情况下,Hibernate并不会立即更新数据库,而是等到事务提交或者Session关闭时才进行同步。`flush()`方法强迫Hibernate执行...

    hibernate session生命周期示例

    这不仅释放数据库连接,还清理了Session中的缓存。不正确地管理Session可能导致内存泄漏和资源浪费。 在实际应用中,通常推荐使用Transaction模板或者Spring的HibernateTemplate或JpaTemplate,它们可以帮助你更好...

    hibernate--3.Hibernate数据持久化(通过 Session 操纵对象)

    当我们在Session上进行操作时,这些操作不会立即反映到数据库中,而是被缓存起来,直到调用`flush()`方法或者事务提交时才会真正执行。 在开始使用Session之前,需要配置Hibernate的环境,包括创建SessionFactory,...

    hibernate_flush 深入了解

    1. **对象状态检查**:Hibernate会检查Session中的所有对象,判断它们是否需要被更新、插入或删除。这包括对持久化对象的脏检查,即比较对象的当前状态和上次持久化时的状态。 2. **生成SQL语句**:根据对象的状态...

    HIbernate Session 详解

    ### HIbernate Session 详解 #### 一、Session在Hibernate中的地位及作用 在Hibernate框架中,`Session` 是一个非常核心且重要的组件。作为Hibernate提供的主要操作数据库的接口,`Session` 不仅承担着保存、更新...

    hibernate session详细方法,值得珍藏

    - **`clear()`**:清除Session中的所有缓存实体,这对于释放内存资源和避免脏读非常有用。 - **`flush()`**:强制Hibernate将所有未完成的数据库操作同步到数据库,这是在事务结束前通常需要执行的操作。 - **`...

    hibernate的核心接口--Session

    ### Hibernate的核心接口——Session详解 #### 一、Session简述 **1. Session概念** - **定义**: Session 是 Hibernate 框架中最常用的接口之一,它又被称为持久化管理器。Session 负责所有与数据库交互的工作,...

    Hibernate code

    ### Hibernate Session.flush() 方法详解 #### 一、基本概念 在Hibernate中,`Session`是用于与数据库进行交互的主要对象。它提供了一系列API用于执行CRUD(创建、读取、更新、删除)操作,并且它还充当了一个缓存...

    hibernate关于session的关闭实例解析

    在 Hibernate 中,有两个方法可以获取 Session:getSession() 和 openSession()。这两个方法都可以用于获取 Session,但是它们之间存在一些关键的区别。 getCurrentSession() 方法会将 Session 绑定到当前线程中,...

    Hibernate管理Session和批量操作分析

    在Java的持久化框架Hibernate中,管理Session和执行批量操作是优化数据库交互的关键技术。本文主要探讨了如何高效地管理Hibernate的Session以及如何实施批量处理数据,这些技巧对于提升应用程序性能至关重要。 首先...

    hibernate各种常用方法的详解

    ### Hibernate 常用方法详解 #### 一、前言 Hibernate 是一款强大的对象关系映射(ORM)框架,它简化了 Java 应用程序与数据库之间的交互过程。本文将详细介绍 Hibernate 中常用的几种方法,包括 `save`, `update`...

    Hibernate中大量数据的更新

    因此,在批量更新时,需要定期调用 `session.flush()` 和 `session.clear()` 来清除一级缓存。 批量抓取 Hibernate 的批量抓取机制允许将多个INSERT 语句合并成一个批量插入语句,从而提高性能。在 Hibernate 配置...

Global site tag (gtag.js) - Google Analytics