`

Hibernate Session的Flush模式

阅读更多

Hibernate Session的Flush模式 


首先要知道的是:

 

Hibernate会尽量将与数据库的操作延迟,直到必须要与数据库进行交互,例如save方法一般会在提交时才真正执行,最终在提交时会以批处理的方式与数据库进行交互,以提高效率。

而将操作延迟,就是利用缓存,将最后要处理的操作放到缓存中。

 

flush方法的主要作用就是清理缓存,强制数据库与Hibernate缓存同步,以保证数据的一致性。它的主要动作就是向数据库发送一系列的sql语句,并执行这些sql语句,但是不会向数据库提交。而commit方法则会首先调用flush方法,然后提交事务。
     
      在下面的情况下,Hibernate会调用Session.flush()以清理缓存:
     1)事务提交时,如果flush模式不为FlushMode.NEVER,commit()将调用flush().
     2)在某些查询语句之前(此查询语句之前的语句已经改变了数据库状态,所以需要调用flush()以同步数据库是查出来的数据是经过更改的)。
    
     除非明确地指定了flush()命令,否则关于Session何时会执行这些JDBC调用完全是无法保证的,只能保证他们执行的前后顺序。


通过设置session.setFlushMode(),可以精确控制Hibernate的FlushMode.
(1) FlushMode.AUTO:Hibernate判断对象属性有没有改变,如果被更改成为脏数据,则在一个查询语句前将更新此改动以保证数据库的同步。这也是Hibernate的默认清理模式。
(2) FlushMode.COMMIT:在事务结束之前清理session的缓存。这样有可能导致查出脏数据
(3) FlushMode.NEVER:除非强制调用Session.flush(),否则永远不清理Session。相当于将数据库设置为一个只读的数据库。
       【如果此时进行数据的写入操作,会发生错误】
(4) FlushMode.ALWAYS:在每一个查询数据之前都调用Session.flush()。很显然这种效率很低。

在调用Session.flush()时,涉及的SQL语句会按照下面的顺序执行。
(1)         所有的实体进行插入的语句,其顺序按照对象执行Session.save()的时间顺序。
(2)         所有对实体进行更新的语句
(3)         所有对集合元素进行删除,更新或者插入的语句
(4)         所有对实体经行删除的语句,其顺序按照对象执行Session.delete()的时间顺序。
(5)         有一个例外是,如果对象使用native方式生成的ID(持久化标识),则他们一执行save就会被插入。
                 【因为native方式若想得到主键,必须与数据库交互,而hilo方式则不用】)

分享到:
评论

相关推荐

    hibernate的session.flush

    1. **自动flush模式**:默认情况下,`Session`会在一个事务提交前自动调用`flush()`。但是,如果需要在特定时刻强制同步,可以手动调用此方法。 2. **脏检查**:`flush()`过程会进行脏检查,对比对象在内存中的状态...

    hibernate_flush 深入了解

    当达到特定条件或手动调用`Session.flush()`时,Hibernate会将这些变更持久化到数据库。 Flush过程主要包括以下步骤: 1. **对象状态检查**:Hibernate会检查Session中的所有对象,判断它们是否需要被更新、插入...

    hibernate的flush机制

    4. **关闭Session**:当Session被关闭时,Hibernate会自动执行Flush操作,以确保所有未提交的更改都被持久化到数据库中。 #### 错误示例分析 在给定的部分内容中,提到了一个典型的错误场景,其中包含了一个常见的...

    Hibernate_Session_Transaction

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

    hibernate session生命周期示例

    本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个强大的工具。 Hibernate Session是Hibernate的核心接口,它是与数据库交互的主要接口。Session对象负责管理实体对象的状态,包括...

    hibernate session详细方法,值得珍藏

    ### Hibernate Session 详解:值得珍藏的深度解析 在Java持久化领域,Hibernate无疑占据了举足轻重的地位,而`Hibernate Session`则是其中的核心组件之一,它提供了与数据库交互的主要接口,是对象/关系映射(ORM)...

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

    在Java的Hibernate框架中,一级缓存是Session对象内置的缓存机制,它的存在是为了优化数据库操作,减少对数据库的直接访问,从而提高应用程序的性能。一级缓存的生命周期与Session对象相同,也就是说,只要Session...

    HIbernate Session 详解

    无论设置为何种清理模式,显式调用 `session.flush()` 都会导致缓存被清理。 #### 六、对Session的理解 对于 `Session` 这个接口的学习确实是一项挑战,因为它涉及的内容非常广泛且深入。下面是一些关键点: 1. *...

    Hibernate Session 4种对象状态.docx

    当一个对象刚刚被创建,并未通过Hibernate的Session接口进行任何操作时,它处于临时状态。此时,对象未与数据库中的任何记录关联,没有被分配唯一的数据库ID,如果对象发生改变,不会影响数据库中的数据。 2. **...

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

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

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

    在使用Hibernate进行数据库操作时,事务管理和`flush`方法的正确使用至关重要,因为它们直接影响到数据的一致性和安全性。在本文中,我们将深入探讨Hibernate的事务处理机制以及`flush`方法的用法,并分析为何在某些...

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

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

    hibernate的核心接口--Session

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

    hibernate关于session的关闭实例解析

    session.flush(); session.getTransaction().commit(); ``` 总结 本文详细介绍了 Hibernate 中 Session 的关闭实例解析,包括 getSession() 和 openSession() 的区别、getCurrentSession() 的配置、openSession() ...

    深入理解Hibernate中的flush机制

    - `session.createSQLQuery(sql).uniqueResult()`能直接查询到数据,是因为Hibernate在执行查询前会先flush,所以即使事务未提交,查询也是基于已flush的数据进行的,相当于查看了缓存中的状态。 4. **缓存与查询*...

    hibernate5--2.数据持久化及事务

    - 使用`Session.flush()`显式触发脏检查,如果发现异常,事务也会回滚。 通过以上内容,我们了解了Hibernate 5在数据持久化和事务管理方面的基本操作和注意事项。在实际项目中,结合事务的隔离级别、锁机制以及适当...

    hibernate的缓存机制和session对象的产生方式案例

    在这种模式下,开发者需要显式调用SessionFactory的openSession()方法来创建Session,并在事务完成后调用close()方法关闭Session。这种方式适用于短时间的数据库操作,能更好地控制资源的释放。 2. 通过...

    Hibernate管理Session和批量操作分析

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

    关于flush和evict

    ### 关于flush和evict在Hibernate中的应用 #### 一、引言 在持久层框架Hibernate中,`flush()`和`evict()`方法是开发者在处理数据时经常会遇到的两个重要概念。它们对于理解Hibernate的工作机制及其缓存管理至关...

    Hibernate下数据批量处理解决方案

    session.flush(); session.clear(); } } tx.commit(); session.close(); ``` 对于更新和删除操作,可以使用`scroll()`方法,这在Hibernate 2.1.6或更高版本中是支持的。`scroll()`方法返回一个`...

Global site tag (gtag.js) - Google Analytics