Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA中同花顺的确切目的是什么_Java_Jpa_Entitymanager - Fatal编程技术网

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
  • 使用JPQL查询读取建筑
    从建筑b中选择b,其中b.id=123
  • 自动刷新仅在4之前发生,因为Eclipselink无法确定您要读取的内容,因此在进行此读取之前,该人员的年龄必须在数据库中是最新的。在3之前,不需要刷新,因为Eclipselink知道人员的更新不会影响建筑物


    要使用乐观锁定,您必须实现它。请阅读此处的
    @Version
    注释:。否则,您的实体将不会使用乐观锁定,并且“最后一次更新将获胜”。

    检查此问题,可能会回答:@bgp一些回答说“刷新仅在事务中使用?它会刷新(但不会提交),而提交提交数据(显然)”这是我的问题在所有这些中刷新的目的是什么。但是当我刷新时,我看不到数据库中的数据更新。一些教程和一些问题提到刷新只将数据移动到二级缓存。虽然我不知道这意味着什么,但由于数据不在数据库中,我不知道它是否是我记得的那个用户his与实体管理器使用的刷新方法相同。如果更新未反映在数据库中,则在提交过程中一定会引发异常。这可能是一系列事务事件后未同步的持久性上下文。@NickDiv一个简单的示例:persist->memory/flush->database(隔离,其他人不可见)/提交->数据库(其他人可见)。阅读有关数据库事务的信息。如果您怀疑这是缓存问题,可以尝试通过persistence.xml配置文件禁用缓存。将
    共享缓存模式设置为
    @Owenbringo非常感谢您的回答。缓存似乎不是问题所在。也没有引发异常。我不知道为什么我看不到数据库中的数据。刷新的数据是否可以回滚?因此,如果我在数据库上执行读取操作,在读取之前是否会自动调用刷新?还有一个小问题,如果一个线程刷新实体上的一些数据,而另一个线程对其进行一些更改,并在其自己的事务中执行刷新,是否会继续o抛出乐观锁,我只是想知道,正如你所说,刷新的数据只与欠下的事务隔离,其他人看不到。那么,其他线程是否会导致乐观锁?我在上面的回答中回答了你的问题,但提出了一个新的具体问题,而不是“扩展”这一次,可能对其他人没有帮助。