在 Hibernate 中使用 session. ush()有什么用

当我们更新记录时,我们可以使用带 Hibernate 的 session.flush()

235992 次浏览

刷新会话将获取当前会话中的数据与数据库中的数据同步。

关于 Hibernate 网站的更多信息:

flush()非常有用,因为对于 Session 执行 JDBC 调用的时间没有绝对的保证,只能保证它们的执行顺序——除非您使用 flush()

刷新会话会强制 Hibernate 将 Session的内存状态与数据库同步(即向数据库写入更改)。默认情况下,Hibernate 会自动为您刷新更改:

  • 在一些查询执行之前
  • 当事务被提交时

允许显式刷新 Session可以提供在某些情况下可能需要的更精细的控制(获得分配的 ID,控制 Session 的大小,...)。

正如在上面的答案中所说的,通过调用 flush(),我们强制 hibernate 在 Database 上执行 SQL 命令。但是要明白,变化还没有“提交”。 所以在刷新之后和提交之前,如果您直接访问 DB (比如从 SQL 提示符)并检查修改后的行,您将看不到更改。

这与打开2个 SQL 命令会话相同。在提交之前,其他人不能看到在1个会话中所做的更改。

我只知道当我们调用 session.flush()时,我们的语句在数据库中执行,但是没有提交。

假设我们不调用会话对象上的 flush()方法,如果我们调用 commit 方法,它将在内部执行数据库上的语句,然后执行提交。

commit=flush+commit(在功能性的情况下)

因此,我得出的结论是,当我们对 Session 对象调用方法 ush ()时,它不会提交,而是会访问数据库并执行查询并回滚。

为了提交,我们对 Transaction 对象使用 commit ()。

可以使用 flush强制在已知位置实现和检测验证约束,而不是在提交事务时进行验证约束。可能是某些框架逻辑、通过声明性逻辑、容器或模板隐式地调用了 commit。在这种情况下,抛出的任何异常都可能难以捕获和处理(它在代码中可能位置太高)。

例如,如果 save()新的 EmailAddress 对象对地址具有唯一约束,则在提交之前不会得到错误。

调用 flush()会强制插入该行,如果有重复行,则引发 Exception。

但是,必须在异常之后回滚会话。

调用 EntityManager#flush确实有 副作用。它可以方便地用于具有生成的 ID 值(序列值)的实体类型: 这样的 ID 只有在与底层持久层同步时才可用。如果在当前事务结束之前需要此 ID (例如用于日志记录) ,则需要刷新会话。

我只是想把上面给出的所有答案俱乐部,并且把 Flush ()方法和 Session.save ()联系起来,以便给出更多的重要性

Hibernate save ()可用于将实体保存到数据库。我们可以在事务之外调用这个方法,这就是为什么我不喜欢用这个方法来保存数据。如果我们没有使用事务,并且在实体之间进行级联,那么除非刷新会话,否则只保存主实体。

Flash () : 强制会话刷新。它用于与数据库同步会话数据。

当您调用 session.rush ()时,语句将在数据库中执行,但它不会被提交。 如果没有调用 session.rush () ,并且调用 session.commit () ,则在内部 commit ()方法执行语句并提交。

所以 commit () = flash + commit。 因此,session.rush ()只执行数据库中的语句(但不提交) ,而且语句不再是 INMEMORY。它只是强制冲洗会话。

重要的几点是:

我们应该避免保存事务边界之外的内容,否则映射的实体将不会被保存,从而导致数据不一致。忘记刷新会话是很正常的,因为它不会抛出任何异常或警告。 默认情况下,Hibernate 会自动为您刷新更改: 在一些查询执行之前 当事务被提交时 允许显式刷新 Session 可以提供在某些情况下可能需要的更精细的控制(为了获得分配的 ID,为了控制 Session 的大小)

flush()方法导致 Hibernate 刷新会话。可以使用 setFlushMode()方法将 Hibernate 配置为对会话使用刷新模式。要获得当前会话的刷新模式,可以使用 getFlushMode()方法。要检查会话是否脏,可以使用 isDirty()方法。默认情况下,Hibernate 管理会话的刷新。

如文件所述:

Https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/flushing/flushing.html

法拉盛

刷新是同步持久性状态的过程 与基础数据库的上下文 Hibernate Session公开一组方法,通过这些方法 应用程序开发人员可以更改实体的持久状态。

持久性上下文充当事务性 write-behind 缓存, 排队等待任何实体状态更改 首先在内存中应用,并在 刷新时间。刷新操作接受每个实体状态的更改和 将其转换为 INSERTUPDATEDELETE语句。

冲洗策略由电流的 冲洗模式给出 运行 Hibernate 会话。虽然 JPA 只定义了两次刷新 策略(AUTOCOMMIT) ,Hibernate 有很多 更广泛的冲洗类型:

  • ALWAYS: 在每次查询之前刷新会话;
  • AUTO: 这是默认模式,它只在必要时刷新会话;
  • 会话尝试延迟刷新,直到提交当前事务,尽管它也可能过早刷新;
  • 会话刷新被委托给应用程序,应用程序必须显式调用 Session.flush()才能应用 持久性上下文更改。

默认情况下,Hibernate 使用 AUTO刷新模式,该模式触发一个 在下列情况下冲水:

  • 在进行交易前;
  • 在执行与排队的实体操作重叠的 JPQL/HQL 查询之前;
  • 在执行任何没有注册同步的本机 SQL 查询之前。

使用此方法可以调用刷新进程 通过检测状态更改并执行相应的 SQL 语句,将数据库的状态与会话的状态相结合。