首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >flush在JPA中的确切用途是什么?

flush在JPA中的确切用途是什么?
EN

Stack Overflow用户
提问于 2015-08-20 10:10:44
回答 2查看 22.5K关注 0票数 16

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

如果更改只是在提交之后才会持久保存在数据库中,那么为什么要在代码中途刷新。

在运行刷新之后,如果对托管对象进行了任何更改,那么将抛出异常,或者这些更改将被同步,然后将持久化。如果它们被同步了,那么为什么首先要刷新。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-20 11:04:22

从理论上讲,您(作为JPA的用户)永远不应该(或者在绝对罕见的情况下)遇到调用flush()的情况。

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

换句话说,在flush()之前,在flush()上,数据库上实际调用的所有insert、update、delete或任何语句都不会在数据库上发生。刷新是由事务的提交或某些类型的数据库读取引起的。例如,如果执行JPQL查询,则必须执行flush()才能从数据库中获得正确的结果。但是很高兴知道这一点,并且完全由您的JPA实现来处理。

在某些情况下,您可能希望自己控制这种刷新,然后可以使用flush()调用它。

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

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

  1. Read a person Person p = em.find(Person.class, 234)
  2. 更新person p.setAge(31)
  3. Read a building Building b = em.find(Building.class, 123
  4. Read a building with JPQL query select b from Building b where b.id = 123

Automatic flush只发生在4.之前,因为Eclipselink不能确定您要读取的内容,所以在读取之前,数据库中的人的年龄必须是最新的。在3.之前,不需要刷新,因为Eclipselink知道一个人的更新不会影响建筑物。

要使用乐观锁定,您必须实现它。在这里阅读有关@Version注释的内容:https://blogs.oracle.com/carolmcdonald/entry/jpa_2_0_concurrency_and。如果没有它,你的实体将不会使用乐观锁定,并且“最后一次更新获胜”。

票数 12
EN

Stack Overflow用户

发布于 2015-08-20 10:43:10

当事务提交时,实体管理器会为您进行刷新。在某些情况下,就像在容器管理事务中处理乐观锁定一样,您可能需要手动调用flush方法来捕获和处理特定的锁定异常。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32108491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档