进行任何查询之前,JPA自动刷新

时间:2019-06-28 19:20:42

标签: java hibernate spring-boot jpa flush

从JPA文档中,我可以看到AUTO是默认的刷新模式,刷新应在执行任何查询之前进行。我已经在spring boot jpa上进行了尝试,我可以看到刷新不会发生在来自不同实体的查询中,这是预期的吗?即使其他实体可能与此有关系(部门<->这里的人)

根据本文,刷新应在任何查询之前触发: https://vladmihalcea.com/how-do-jpa-and-hibernate-define-the-auto-flush-mode/

// this triggers flush //
 Person person = personRepository.findById(5L).get();
 person.setName("hello test");
 Person person1 = (Person) entityManager.createQuery("select person from Person 
 person where person.id=11").getSingleResult(); // flush before query



// this doesn't trigger flush even if  the department has the person //
 Person person = personRepository.findById(5L).get();
 person.setName("hello test");
 Department department= (Department) entityManager.createQuery("select 
 department from Department
department where department.id=1").getSingleResult();

更新

我注意到只有在具有DML的同一张表上的JPQL查询才会发生刷新,而对于本机sql查询,如果之前存在DML,它将始终在任何查询之前刷新。即使没有刷新,JPQL也会返回修改后的管理实体,而不是DB中的那个。有人可以解释一下是否遵循JPA标准吗?

1 个答案:

答案 0 :(得分:1)

由于JPA是规范,因此此问题很容易回答。查看规格:-)

3.10.8查询和刷新模式

刷新模式设置会影响查询结果,如下所示。 在事务内执行查询时,如果在Query,TypedQuery或StoredProcedureQuery对象上设置了FlushModeType.AUTO,或者持久性上下文的刷新模式设置为AUTO(默认值),并且尚未为在查询对象中,持久性提供者负责确保对持久性上下文中所有实体状态的所有更新都可能对查询的处理可见,而这些更新可能会影响查询结果。 查询。持久性提供程序实现可以通过将这些实体刷新到数据库或通过其他某种方式来实现。如果设置了FlushModeType.COMMIT,则未指定对持久化上下文中的实体进行查询更新的效果。

如果持久性上下文尚未加入当前事务,则持久性提供程序必须 无论刷新模式设置如何,都不会刷新到数据库。

package javax.persistence;
public enum FlushModeType {
COMMIT,
AUTO
}

如果没有活动的事务,则持久性提供程序不得刷新到数据库

https://download.oracle.com/otn-pub/jcp/persistence-2_1-fr-eval-spec/JavaPersistence.pdf?AuthParam=1561799350_4cc62583442da694a6a033af82faf986

然后是Hibernate Doc:

6.1。自动冲洗

默认情况下,Hibernate使用AUTO刷新模式,该模式在以下情况下触发刷新:

  • 在提交交易之前

  • 在执行与排队的实体操作重叠的JPQL / HQL查询之前

  • 在执行任何未注册同步的本机SQL查询之前

https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#flushing