JPA中SQL查询触发的时间问题
我正在使用JPA进行数据持久化 我无法解释程序中的行为 我有一个实体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。我希望这会发生在事务
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行为的每一个细节。我每次都在不断地阅读和实验,但仍然时不时地出现这样的问题,我觉得很难解释。有什么好的资源吗?不客气。没有一个单一的学习资源涵盖一切。书籍,论坛,文章,实验,深入的源代码…你应该阅读规范,这是非常清楚的。顺便说一句,我下面的回答是正确的,以防万一。。。