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

时间:2015-08-20 02:10:44

标签: java jpa entitymanager

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

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

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

2 个答案:

答案 0 :(得分:4)

理论上,您(作为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
  5. 阅读建筑物

    自动刷新仅在4.之前发生,因为Eclipselink无法确定您要阅读的内容,因此此人的年龄必须在数据库之前保持最新状态读可以发生。 3.之前没有需要刷新,因为Eclipselink知道一个人的更新不会影响建筑物。

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

答案 1 :(得分:1)

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