`

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 是一个基于Java的 ORM(Object-Relational Mapping)工具,提供了将 Java 对象映射到关系数据库的能力。其中 Session_flush 和隔离级别是两个重要的概念。 ...

    Hibernate_Session_Transaction

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

    hibernate的session.flush

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

    Many-To-Many_Element.rar_hibernate 多对多

    在实践中,要注意性能优化,比如合理选择关联容器类型,以及适时地调用`session.flush()`和`session.clear()`来管理缓存和事务。通过深入学习和实践,你将能够自如地应对各种多对多关系的映射需求。

    hibernate_flush 深入了解

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

    hibernate的核心接口--Session

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

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

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

    hibernate-5.2.15. 最新jar包

    在业务逻辑处理中,通常使用Session的beginTransaction、save/merge、flush和commit等方法来完成数据库操作。 3. **Query和Criteria API**:提供两种方式执行查询,一是HQL(Hibernate Query Language),类似于SQL...

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

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

    hibernate-release-5.0.7.Final.zip官方

    session.flush(); session.clear(); } } tx.commit(); } catch (Exception e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } ``` #### 五、常见问题解答 **...

    hibernate--4.使用hibernate的缓存-1

    一级缓存的清理通常由Session的flush()或close()方法触发,而二级缓存可以通过设置定时任务或事件监听器等方式定期清理。对于数据的更新,Hibernate提供了穿透式缓存、查询缓存等多种方式来处理。 总结起来,...

    hibernate的flush机制

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

    hibernate-release-5.4.17.Final.zip

    1. CRUD操作:通过Session接口实现增删改查,如`session.save()`、`session.get()`、`session.update()`和`session.delete()`。 2. HQL查询:使用Query接口进行基于Hibernate Query Language的查询,支持复杂条件和...

    Open_Session_In_View详解.doc

    `Open Session In View`的主要作用是在Web请求的开始阶段打开`Hibernate session`,并在请求结束时自动关闭该session。这样做的好处在于,可以确保在整个请求处理过程中session始终处于可用状态,使得在视图(View)层...

    hibernate_cache_level_1.rar_alreadydcc_java

    3. 清理与刷新:Session的clear()方法会清空一级缓存,而flush()方法则会强制将所有未提交的更改同步到数据库。 四、压缩包内容分析 "hibernate_cache_level_1.rar"文件很可能包含了一个示例项目,用于演示如何在...

    hibernate-release-5.1.16.Final.zip

    2. 更新:调用Session的update()方法,或者直接修改对象属性后调用flush()方法。 3. 删除:使用Session的delete()方法,将对象从数据库中移除。 4. 查询:Criteria API和Query API提供了丰富的查询手段,可以根据...

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

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

    Hibernate教程_note.pdf

    在Hibernate中,session_flush功能是涉及到Session对象的flush操作。当在应用层更新或保存实体时,这些操作会被缓存起来,并不会立即反映到数据库中。直到调用Session.flush()方法,Hibernate才会把缓存中待处理的...

    hibernate session生命周期示例

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

    hibernate关于session的关闭实例解析

    关于 Hibernate 中 Session 的关闭实例解析 Hibernate 是一个流行的 Java 持久层框架,它提供了许多强大功能来管理数据库交互。Session 是 Hibernate 中的一种基本概念,它扮演着关键角色来管理数据库交互。本文将...

Global site tag (gtag.js) - Google Analytics