Java JPA中同花顺的确切目的是什么
一些令人困惑的解释: 冲洗();刷新是将基础持久性存储与内存中的持久性状态同步的过程。它将在正在运行的事务中更新或插入到表中,但可能不会提交这些更改Java JPA中同花顺的确切目的是什么,java,jpa,entitymanager,Java,Jpa,Entitymanager,一些令人困惑的解释: 冲洗();刷新是将基础持久性存储与内存中的持久性状态同步的过程。它将在正在运行的事务中更新或插入到表中,但可能不会提交这些更改 如果更改只在提交之后在数据库中保持,那么为什么要在代码中间刷新。 在运行刷新之后,如果对托管对象进行了任何更改,那么将引发异常,或者这些更改将被同步,然后将被隔离。如果它们被同步,那么为什么要首先刷新呢 当事务提交时,实体管理器会为您进行刷新。在某些情况下,例如在容器管理的事务中处理乐观锁定,您可能需要手动调用flush方法来捕获和处理特定的锁定异
如果更改只在提交之后在数据库中保持,那么为什么要在代码中间刷新。
在运行刷新之后,如果对托管对象进行了任何更改,那么将引发异常,或者这些更改将被同步,然后将被隔离。如果它们被同步,那么为什么要首先刷新呢 当事务提交时,实体管理器会为您进行刷新。在某些情况下,例如在容器管理的事务中处理乐观锁定,您可能需要手动调用flush方法来捕获和处理特定的锁定异常。理论上,您(作为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
从建筑b中选择b,其中b.id=123
要使用乐观锁定,您必须实现它。请阅读此处的
@Version
注释:。否则,您的实体将不会使用乐观锁定,并且“最后一次更新将获胜”。检查此问题,可能会回答:@bgp一些回答说“刷新仅在事务中使用?它会刷新(但不会提交),而提交提交数据(显然)”这是我的问题在所有这些中刷新的目的是什么。但是当我刷新时,我看不到数据库中的数据更新。一些教程和一些问题提到刷新只将数据移动到二级缓存。虽然我不知道这意味着什么,但由于数据不在数据库中,我不知道它是否是我记得的那个用户his与实体管理器使用的刷新方法相同。如果更新未反映在数据库中,则在提交过程中一定会引发异常。这可能是一系列事务事件后未同步的持久性上下文。@NickDiv一个简单的示例:persist->memory/flush->database(隔离,其他人不可见)/提交->数据库(其他人可见)。阅读有关数据库事务的信息。如果您怀疑这是缓存问题,可以尝试通过persistence.xml配置文件禁用缓存。将共享缓存模式设置为无
@Owenbringo非常感谢您的回答。缓存似乎不是问题所在。也没有引发异常。我不知道为什么我看不到数据库中的数据。刷新的数据是否可以回滚?因此,如果我在数据库上执行读取操作,在读取之前是否会自动调用刷新?还有一个小问题,如果一个线程刷新实体上的一些数据,而另一个线程对其进行一些更改,并在其自己的事务中执行刷新,是否会继续o抛出乐观锁,我只是想知道,正如你所说,刷新的数据只与欠下的事务隔离,其他人看不到。那么,其他线程是否会导致乐观锁?我在上面的回答中回答了你的问题,但提出了一个新的具体问题,而不是“扩展”这一次,可能对其他人没有帮助。