JPA автоматическая очистка перед любым запросом - PullRequest
1 голос
/ 28 июня 2019

Из документации JPA я вижу, что AUTO является режимом сброса по умолчанию, сбрасывание должно происходить перед выполнением любого запроса. Я пробовал это на весенней загрузке 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();

Обновление:

Я заметил, что сброс выполняется для запросов JPQL к одной и той же таблице только с DML, в то время как для собственных запросов sql он всегда сбрасывается перед любым запросом, если ранее был DML. даже если сброса не происходит, JPQL возвращает управляемый объект с изменением, а не изменением в БД. Может кто-нибудь объяснить, если это соответствует стандарту JPA или нет?

1 Ответ

1 голос
/ 29 июня 2019

Поскольку 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:

6,1. AUTO flush

По умолчанию Hibernate использует режим AUTO flush, который запускает сброс в следующих случаях:

  • до совершения транзакции

  • до выполнения запроса JPQL / HQL, который перекрывается с действиями объекта в очереди

  • перед выполнением любого собственного запроса SQL, который не имеет зарегистрированной синхронизации

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

...