一些令人困惑的解释: flush();flush是将底层持久化存储与持久化状态同步的过程,memory.it将更新或插入正在运行的事务中的表,但它可能不会提交这些更改。
如果更改只是在提交之后才会持久保存在数据库中,那么为什么要在代码中途刷新。
在运行刷新之后,如果对托管对象进行了任何更改,那么将抛出异常,或者这些更改将被同步,然后将持久化。如果它们被同步了,那么为什么首先要刷新。
发布于 2015-08-20 11:04:22
从理论上讲,您(作为JPA的用户)永远不应该(或者在绝对罕见的情况下)遇到调用flush()
的情况。
刷新是将基础持久存储与内存中保存的持久状态同步的过程
换句话说,在flush()
之前,在flush()
上,数据库上实际调用的所有insert、update、delete或任何语句都不会在数据库上发生。刷新是由事务的提交或某些类型的数据库读取引起的。例如,如果执行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
Automatic flush只发生在4.之前,因为Eclipselink不能确定您要读取的内容,所以在读取之前,数据库中的人的年龄必须是最新的。在3.之前,不需要刷新,因为Eclipselink知道一个人的更新不会影响建筑物。
要使用乐观锁定,您必须实现它。在这里阅读有关@Version
注释的内容:https://blogs.oracle.com/carolmcdonald/entry/jpa_2_0_concurrency_and。如果没有它,你的实体将不会使用乐观锁定,并且“最后一次更新获胜”。
发布于 2015-08-20 10:43:10
当事务提交时,实体管理器会为您进行刷新。在某些情况下,就像在容器管理事务中处理乐观锁定一样,您可能需要手动调用flush方法来捕获和处理特定的锁定异常。
https://stackoverflow.com/questions/32108491
复制相似问题