Что делает EntityManager.flush и зачем мне его использовать?
У меня есть EJB, где я сохраняю объект в базе данных. В примере, который я видел, после сохранения этих данных (EntityManager.persist) происходит вызов EntityManager.flush(); Зачем мне это делать? Сохраняемый объект не прикреплен и не используется позже в методе. Фактически, после сохранения метод возвращается, и я ожидаю, что ресурсы будут освобождены. (Пример кода также делает это при удалении вызова.)
if (somecondition) {
entityManager.persist(unAttachedEntity);
} else {
attachedEntityObject.setId(unAttachedEntity.getId());
}
entityManager.flush();
Ответы
Ответ 1
Вызов EntityManager.flush();
заставит данные сохраняться в базе данных немедленно, поскольку EntityManager.persist()
не будет (в зависимости от того, как настроен EntityManager: FlushModeType (AUTO или COMMIT) по умолчанию он установлен на AUTO, и сброс будет выполняться автоматически, если он настроен на COMMIT, постоянство данных в базовой базе данных будет отложено при совершении транзакции).
Ответ 2
Операцию EntityManager.flush()
можно использовать для записи всех изменений в базе данных до совершения транзакции. По умолчанию JPA обычно не записывает изменения в базу данных до тех пор, пока транзакция не будет выполнена. Это обычно желательно, поскольку оно позволяет избежать доступа к базе данных, ресурсов и блокировок до тех пор, пока это не будет необходимо. Он также позволяет упорядочивать записи в базе данных и собирать для оптимального доступа к базе данных, а также поддерживать ограничения целостности и избегать взаимоблокировок. Это означает, что при вызове persist, слияние или удаление базы данных DML INSERT
, UPDATE
, DELETE
не выполняется, до фиксации или до срабатывания флеша.
Ответ 3
EntityManager.persist()
делает объект постоянным, тогда как EntityManager.flush()
выполняет запрос в вашей базе данных.
Итак, когда вы вызываете EntityManager.flush()
, в базе данных выполняются запросы для вставки/обновления/удаления связанных объектов. В это время будут известны любые ошибки ограничения (ширина столбца, типы данных, внешний ключ).
Конкретное поведение зависит от того, является ли режим промывки AUTO или COMMIT.
Ответ 4
Поэтому, когда вы вызываете EntityManager.persist()
, он только управляет объектом с помощью EntityManager
и добавляет его (экземпляр сущности) в Persistence Context
. Явная flush()
заставит объект, который теперь находится в Persistence Context
, перемещаться в базу данных (используя SQL).
Без flush() это (перемещение объекта из Persistence Context
в базу данных) произойдет, когда транзакция, с которой связана эта Persistence Context
, будет зафиксирована.