【发布时间】:2019-11-10 17:25:35
【问题描述】:
从 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 标准?
【问题讨论】:
-
阅读这里,没有比 Vlad 更好的来源了:vladmihalcea.com/…
-
@Shadov 我读过,但它与 hibernate 相关,我使用的是 jpa 而没有本机查询
-
@MohammadKarmi JPA 只是一个规范/文档。 Hibernate EclipseLink 等是它的实现。您正在使用休眠或其他提供程序。
-
@AlexandarPetrov 我知道,但是 JPA 以不同的方式进行刷新vladmihalcea.com/…
-
@MohammadKarmi 今天我学到了一些新东西 :)
标签: java hibernate spring-boot jpa flush