JPA中冲洗的确切目的是什么

Nic*_*Div 9 java jpa entitymanager

一些令人困惑的解释:flush(); 刷新是将底层持久存储与内存中保持的持久状态同步的过程.它将在正在运行的事务中更新或插入到表中,但它可能不会提交这些更改.

如果只有在提交之后才会在数据库中保留更改,那么为什么要在代码中间进行刷新.

并且在运行刷新之后,如果对托管对象进行了任何更改,那么将抛出异常,或者这些将被同步,然后将变为永久.如果他们得到同步,那么为什么要在第一时间冲洗.

Mat*_*ert 5

从理论上讲,您(作为JPA的用户)绝对不应(或在极为罕见的情况下)陷入困境flush()

刷新是将基础持久性存储与保存在内存中的可持久状态进行同步的过程

换句话说,在flush()数据库上flush()什么都没有发生之前,对数据库进行的所有插入,更新,删除或任何实际调用的语句。刷新是由事务提交或某些类型的数据库读取引起的。例如,如果执行JPQL查询,则必须执行一次flush()操作才能从数据库中获取正确的结果。但这真是太好了,可以完全由您的JPA实现来处理。

在某些情况下,您想自己控制冲洗,然后可以使用调用它flush()

编辑以回答评论中的问题:

并非每次读取都需要刷新,请考虑以下情形(一个事务):

  1. 读一个人 Person p = em.find(Person.class, 234)
  2. 更新人 p.setAge(31)
  3. 阅读建筑物 Building b = em.find(Building.class, 123
  4. 使用JPQL查询读取建筑物 select b from Building b where b.id = 123

自动刷新仅在4.之前发生,因为Eclipselink不能确定您要读取的内容,因此该人的年龄必须在数据库上是最新的,然后才能进行读取。在3.之前,不需要刷新,因为Eclipselink知道人的更新不会影响建筑物。

要使用乐观锁定,您必须实现它。在@Version此处阅读有关注释的信息:https : //blogs.oracle.com/carolmcdonald/entry/jpa_2_0_concurrency_and。否则,您的实体将不会使用乐观锁定,并且“最后更新将获胜”。