Подтвердить что ты не робот

Что делает EntityManager.flush и зачем мне его использовать?

У меня есть EJB, где я сохраняю объект в базе данных. В примере, который я видел, после сохранения этих данных (EntityManager.persist) происходит вызов EntityManager.flush(); Зачем мне это делать? Сохраняемый объект не прикреплен и не используется позже в методе. Фактически, после сохранения метод возвращается, и я ожидаю, что ресурсы будут освобождены. (Пример кода также делает это при удалении вызова.)

if (somecondition) {
    entityManager.persist(unAttachedEntity);
} else {
    attachedEntityObject.setId(unAttachedEntity.getId());
}
entityManager.flush();
4b9b3361

Ответ 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, будет зафиксирована.