一些令人困惑的解释: 冲洗();刷新是将底层持久存储与内存中保持的持久状态同步的过程。它将在正在运行的事务中更新或插入到表中,但它可能不会提交这些更改。
如果只有在提交之后才会在数据库中持久保存更改,那么为什么要在代码中间进行刷新。
在运行刷新之后,如果对托管对象进行了任何更改,那么将抛出异常,或者这些将被同步,然后将获得永久性。如果他们得到同步,那么为什么要在第一时间冲洗。
答案 0 :(得分:4)
理论上,您(作为JPA的用户)不应该(或在极少数情况下)遇到调用flush()
的情况。
刷新是同步底层持久性的过程 存储在内存中的持久状态
换句话说,在flush()
所有插入,更新,删除或在数据库上实际调用的任何语句之前,数据库中没有任何事件发生flush()
。刷新是由提交事务或某些类型的数据库读取引起的。例如,如果执行JPQL查询,则必须执行flush()
才能从数据库中获取正确的结果。但是,通过JPA实现了解并完全处理这一点非常好。
在某些情况下,您可能希望自己控制此刷新,然后可以使用flush()
调用它。
修改以回答评论中的问题:
不是每次阅读都需要刷新,请考虑这种情况(一次交易):
Person p = em.find(Person.class, 234)
p.setAge(31)
Building b = em.find(Building.class, 123
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。如果没有这个,你的实体将不会使用乐观锁定,并且"最后一次更新获胜"。
答案 1 :(得分:1)
当事务提交时,实体管理器会为您执行刷新操作。在某些情况下,就像在容器管理的事务中处理乐观锁定一样,您可能需要手动调用flush方法来捕获和处理特定的锁定异常。