Я собирал информацию о методе flush (), но не совсем понимаю, когда его использовать и как правильно использовать. Из того, что я прочитал, я понимаю, что содержимое контекста постоянства будет синхронизировано с базой данных, то есть выдача невыполненных инструкций или обновление данных объекта.
Теперь у меня есть следующий сценарий с двумя объектами A
и B
(в отношении один-к-одному, но не принудительно или смоделированным JPA). A
имеет составной PK, который устанавливается вручную, а также имеет автоматически сгенерированное поле IDENTITY recordId
. Это recordId
должно быть записано в объект B
как внешний ключ для A
. Сохраняю A
и B
в единой транзакции. Проблема заключается в том, что автоматически сгенерированное значение A.recordId
не доступно в сделке, если не сделать явный вызов em.flush()
после вызова em.persist()
на A
. (Если у меня есть автоматически сгенерированный PK IDENTITY, значение обновляется непосредственно в сущности, но здесь это не так.)
Может ли em.flush()
причинить вред при использовании в транзакции?
источник
На самом деле,
em.flush()
делать больше, чем просто отправлять кэшированные команды SQL. Он пытается синхронизировать контекст постоянства с базовой базой данных. Это может привести к значительным затратам времени на ваши процессы, если ваш кеш содержит коллекции, которые необходимо синхронизировать.Осторожно при его использовании.
источник
Да, он может удерживать блокировки в базе данных дольше, чем необходимо.
Как правило, при использовании JPA вы делегируете управление транзакциями контейнеру (также известному как CMT - с использованием аннотации @Transactional для бизнес-методов), что означает, что транзакция автоматически запускается при входе в метод и фиксируется / откатывается в конце. Если вы позволите EntityManager обрабатывать синхронизацию базы данных, выполнение операторов sql будет запускаться только непосредственно перед фиксацией, что приведет к кратковременным блокировкам в базе данных. В противном случае ваши вручную очищенные операции записи могут сохранять блокировки между ручным сбросом и автоматической фиксацией, которые могут быть долгими в зависимости от оставшегося времени выполнения метода.
Отмечает, что некоторые операции автоматически запускают сброс: выполнение собственного запроса к тому же сеансу (состояние EM должно быть сброшено, чтобы оно стало доступным для запроса SQL), вставка сущностей с использованием собственного сгенерированного идентификатора (сгенерированного базой данных, поэтому оператор вставки должен быть запускается, таким образом, EM может получить сгенерированный идентификатор и правильно управлять отношениями)
источник