JPA 中 SQL 查询触发的时间问题
Issue with timing of SQL query firing in JPA
我正在使用 JPA 进行数据持久化。
我无法解释程序中的行为。
我有一个实体 A
,它有另一个实体 B
作为它的 member.In 我的代码 我创建了 A
的新实例并设置了 [=12] 的实例=](从数据库中获取)在 A
中,然后我使用 EntityManager
保存 A
。我正在使用容器管理的事务,因此所有事务都应该在方法结束时提交。
以同样的方法,在坚持 A
之后,我尝试获取 class C
的实体。 C
和 A
一样,有 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
,这意味着持久性上下文可能会在查询执行之前被刷新。
我正在使用 JPA 进行数据持久化。
我无法解释程序中的行为。
我有一个实体 A
,它有另一个实体 B
作为它的 member.In 我的代码 我创建了 A
的新实例并设置了 [=12] 的实例=](从数据库中获取)在 A
中,然后我使用 EntityManager
保存 A
。我正在使用容器管理的事务,因此所有事务都应该在方法结束时提交。
以同样的方法,在坚持 A
之后,我尝试获取 class C
的实体。 C
和 A
一样,有 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
,这意味着持久性上下文可能会在查询执行之前被刷新。