Answers:
刷新会话会强制Hibernate将的内存中状态Session
与数据库同步(即,将更改写入数据库)。默认情况下,Hibernate将自动为您刷新更改:
允许显式刷新Session
s在某些情况下可能需要更好的控制(获得ID分配,控制Session的大小...)。
就像上面答案中正确说的那样,通过调用flush()
我们强制休眠在数据库上执行SQL命令。但是请务必了解,更改尚未“提交”。因此,在执行刷新操作和提交操作之前,如果直接访问数据库(例如从SQL提示符访问)并检查修改后的行,则不会看到更改。
这与打开2个SQL命令会话相同。在一次会话中完成的更改只有在提交后才对其他人可见。
我只知道,当我们调用时,session.flush()
语句在数据库中执行但未提交。
假设我们不在flush()
会话对象上调用方法,并且如果我们调用commit方法,它将在内部完成在数据库上执行语句然后提交的工作。
commit=flush+commit
(如果有功能)
因此,我得出的结论是,当我们在Session对象上调用方法flush()时,它不会得到提交,但会命中数据库并执行查询并也会得到回滚。
为了提交,我们在Transaction对象上使用commit()。
刷新会话将使会话中当前的数据与数据库中的数据同步。
Hibernate网站上的更多信息:
flush()
之所以有用,是因为绝对不保证会话何时执行JDBC调用,仅保证它们执行的顺序(除非您使用)flush()
。
我只想总结以上给出的所有答案,并将Flush()方法与Session.save()关联起来,以便更加重视
Hibernate save()可用于将实体保存到数据库。我们可以在事务外部调用此方法,这就是为什么我不喜欢此方法保存数据的原因。如果我们在不使用事务的情况下使用它,并且在实体之间进行级联,那么只有主实体会被保存,除非刷新会话。
flush():强制刷新会话。它用于将会话数据与数据库同步。
当您调用session.flush()时,语句在数据库中执行,但不会提交。如果不调用session.flush(),并且调用session.commit(),则内部commit()方法将执行该语句并提交。
所以commit()= flush + commit。因此,session.flush()仅执行数据库中的语句(但不执行提交),并且语句不再处于内存中。它只是强制会话刷新。
几个要点:
我们应避免在事务边界之外保存,否则将不会保存映射的实体,从而导致数据不一致。忘记刷新会话非常正常,因为它不会引发任何异常或警告。默认情况下,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
冲洗
刷新是将持久性上下文的状态与基础数据库同步的过程。的
EntityManager
和休眠Session
暴露了一组方法,通过该应用程序开发者可改变的实体的持久状态。持久性上下文充当事务后写式高速缓存,对任何实体状态更改进行排队。像任何后写式缓存一样,更改首先会在内存中应用,并在刷新期间与数据库同步。冲洗操作需要每一个实体的状态变化,并将其转换到
INSERT
,UPDATE
或DELETE
声明。刷新策略由当前运行的Hibernate会话的flushMode给出。尽管JPA仅定义了两种刷新策略(
AUTO
和COMMIT
),但是Hibernate具有更广泛的刷新类型范围:
ALWAYS
:在每次查询之前刷新会话;AUTO
:这是默认模式,仅在必要时才刷新会话;COMMIT
:会话尝试将刷新延迟到提交当前事务之前,尽管它也可能会过早刷新。MANUAL
:将会话刷新委托给应用程序,该应用程序必须Session.flush()
显式调用才能应用持久性上下文更改。默认情况下,Hibernate使用
AUTO
刷新模式,该模式在以下情况下触发刷新:
- 在进行交易之前;
- 在执行与排队的实体操作重叠的JPQL / HQL查询之前;
- 在执行任何没有注册同步的本机SQL查询之前。