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

JPA中SQL查询触发的时间问题,jpa,entitymanager,Jpa,Entitymanager,我正在使用JPA进行数据持久化 我无法解释程序中的行为 我有一个实体A,它的成员是另一个实体B。在我的代码中,我创建了A的新实例,并在A中设置了B(从数据库中获取)的实例,然后我使用EntityManager保存A。我使用的是容器管理的事务,所以所有事务都应该在方法末尾提交 在非常相同的方法中,在持久化A之后,我尝试获取类C的实体C与A一样,具有B作为其成员。我使用JQPL查询获取C,以获取先前与a实例关联的B实例的id 问题是,在获取C时,JPA也在执行SQL查询以保存A。我希望这会发生在事务

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

我无法解释程序中的行为

我有一个实体
A
,它的成员是另一个实体
B
。在我的代码中,我创建了
A
的新实例,并在
A
中设置了
B
(从数据库中获取)的实例,然后我使用
EntityManager
保存
A
。我使用的是容器管理的事务,所以所有事务都应该在方法末尾提交

在非常相同的方法中,在持久化
A
之后,我尝试获取类
C
的实体
C
A
一样,具有
B
作为其成员。我使用JQPL查询获取
C
,以获取先前与
a
实例关联的
B
实例的id

问题是,在获取
C
时,JPA也在执行SQL查询以保存
A
。我希望这会发生在事务结束时(即方法结束时)。 但是它发生在我试图获取
C
时。若我不获取
C
,那个么当方法结束时,就会发出保存
A
的SQL查询


这种行为的原因是什么?

原因是数据库隔离级别。默认情况下,它是读取提交的。 请在此处阅读有关隔离级别的更多信息:


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

原因是数据库隔离级别。默认情况下,它是读取提交的。 请在此处阅读有关隔离级别的更多信息:


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

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


您可以为所需(或所有)会话设置为。如果查询依赖于脏持久性上下文状态,请记住手动刷新会话。默认刷新模式为,这意味着可以在执行查询之前刷新持久性上下文

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


您可以为所需(或所有)会话设置为。如果查询依赖于脏持久性上下文状态,请记住手动刷新会话。默认刷新模式为,这意味着可以在执行查询之前刷新持久性上下文

嗯……这是一个非常合理的观点。非常感谢。顺便说一句,你怎么知道JPA行为的每一个细节。我每次都在不断地阅读和实验,但仍然时不时地出现这样的问题,我觉得很难解释。有什么好的资源吗?不客气。没有一个单一的学习资源涵盖一切。书籍,论坛,文章,实验,深入的源代码…你应该阅读规范,这是非常清楚的。顺便说一句,我下面的回答是正确的,以防万一……嗯……这是一个非常合理的观点。非常感谢。顺便说一句,你怎么知道JPA行为的每一个细节。我每次都在不断地阅读和实验,但仍然时不时地出现这样的问题,我觉得很难解释。有什么好的资源吗?不客气。没有一个单一的学习资源涵盖一切。书籍,论坛,文章,实验,深入的源代码…你应该阅读规范,这是非常清楚的。顺便说一句,我下面的回答是正确的,以防万一。。。