Java 什么';这是Hibernate中session.flush()的用法

Java 什么';这是Hibernate中session.flush()的用法,java,hibernate,orm,Java,Hibernate,Orm,当我们更新记录时,我们可以使用Hibernate的session.flush()。flush()需要什么?刷新会话将使当前会话中的数据与数据库中的数据同步 有关Hibernate网站的更多信息: flush()非常有用,因为对于会话何时执行JDBC调用,没有任何保证,只有它们的执行顺序——除非您使用flush()刷新会话,否则会强制休眠将会话的内存状态与数据库同步(即将更改写入数据库)。默认情况下,Hibernate将自动为您刷新更改: 在执行某些查询之前 提交事务时 允许显式刷新会话

当我们更新记录时,我们可以使用Hibernate的
session.flush()
flush()
需要什么?

刷新会话将使当前会话中的数据与数据库中的数据同步

有关Hibernate网站的更多信息:


flush()
非常有用,因为对于会话何时执行JDBC调用,没有任何保证,只有它们的执行顺序——除非您使用
flush()

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

  • 在执行某些查询之前
  • 提交事务时

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

如上述答案所述,通过调用
flush()
我们强制hibernate在数据库上执行SQL命令。但请务必理解,更改尚未“提交”。 因此,在执行flush之后和执行commit之前,如果您直接访问DB(比如从SQL提示符)并检查修改的行,您将看不到更改


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

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

假设我们不对会话对象调用
flush()

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

因此,我得出结论,当我们对会话对象调用方法flush()时,它不会得到commit,而是命中数据库并执行查询并得到回滚


为了提交,我们使用commit()在事务对象上。

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

例如,如果您
save()
一个新的EmailAddress对象,该对象对地址有唯一的约束,则在提交之前不会出现错误

调用
flush()


但是,您必须在异常发生后回滚会话。

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

我只想使用上面给出的所有答案,并将Flush()方法与session.save()相关联以便给予更多的重视

Hibernate save()可用于将实体保存到数据库。我们可以在事务外部调用此方法,这就是我不喜欢此方法保存数据的原因。如果我们在没有事务的情况下使用此方法,并且实体之间存在级联,则除非刷新会话,否则只保存主实体

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

调用session.flush()时,这些语句在数据库中执行,但不会提交。 如果不调用session.flush()并且调用session.commit(),则内部commit()方法将执行语句并提交

所以commit()=刷新+提交。 所以session.flush()只执行数据库中的语句(但不执行提交),语句不再存在于内存中。它只是强制会话刷新

几点要点:

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

该方法导致Hibernate刷新会话。您可以使用方法将Hibernate配置为使用会话刷新模式。要获取当前会话的刷新模式,可以使用方法。要检查会话是否脏,可以使用方法。默认情况下,Hibernate管理会话刷新

如文件所述:

冲洗

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

持久性上下文充当事务性写后缓存, 对任何实体状态更改进行排队。与任何写后缓存一样,更改 首先在内存中应用,并在运行期间与数据库同步 刷新时间。刷新操作接受每个实体状态的更改和 将其转换为
INSERT
UPDATE
DELETE
语句

冲洗策略由电流的 正在运行Hibernate会话.Altho