JPA 中 SQL 查询触发的时间问题

Issue with timing of SQL query firing in JPA

我正在使用 JPA 进行数据持久化。

我无法解释程序中的行为。

我有一个实体 A,它有另一个实体 B 作为它的 member.In 我的代码 我创建了 A 的新实例并设置了 [=12] 的实例=](从数据库中获取)在 A 中,然后我使用 EntityManager 保存 A。我正在使用容器管理的事务,因此所有事务都应该在方法结束时提交。

以同样的方法,在坚持 A 之后,我尝试获取 class C 的实体。 CA 一样,有 B 作为它的成员。我使用 JQPL 查询来获取 C 以获取我之前与 A 的实例相关联的 B 实例的 ID。

问题是在获取 C 时,JPA 也在执行 SQL 查询以保存 A。我希望这发生在交易结束时(即方法结束时)。 但是它在我尝试获取 C 时发生了。如果我不获取 C,则在方法结束时发出 SQL 保存查询 A

造成这种行为的原因是什么?

原因是数据库隔离级别。默认为 read_commited。 在此处阅读有关隔离级别的更多信息: https://en.wikipedia.org/wiki/Isolation_%28database_systems%29#Read_committed

因此,为了不破坏这种隔离,JPA 必须在事务中的所有数据都已到达数据库的缓冲区中执行所有 SQL 语句。

如果查询结果可能与当前持久上下文状态不一致,JPA 提供程序需要在执行查询之前刷新持久上下文。

您可以设置flush mode to COMMIT for the desired (or all) sessions. Just keep in mind to manually flush the session if a query depends on the dirty persistence context state. Default flush mode is AUTO,这意味着持久性上下文可能会在查询执行之前被刷新。