Правильное использование flush() в JPA / Hibernate



я собирал информацию о методе flush (), но я не совсем понимаю, когда его использовать и как правильно его использовать. Из того, что я прочитал, я понимаю, что содержимое контекста персистентности будет синхронизировано с базой данных, т. е. выдача невыполненных инструкций или обновление данных сущности.



теперь я получил следующий сценарий с двумя сущностями A и B (в отношениях один-к-одному, но не принудительно или по образцу JPA). A есть композитный ПК, который устанавливается вручную, а также имеет автоматически сгенерированное поле идентификации recordId. Это recordId должно быть записано в entity B как внешний ключ к A. Я спасаю A и B в одной транзакции. Проблема в том, что автоматически генерируемое значение A.recordId не доступен в транзакции, если я не сделаю явный вызов em.flush() после вызова em.persist() on A. (Если у меня есть автоматически сгенерированный идентификатор PK, то значение напрямую обновляется в сущности, но здесь все не так.)



можете em.flush() причинить какой-либо вред при использовании его в рамках транзакции?

671   2  

2 ответов:

вероятно, точные детали em.flush() зависит от реализации. В общем, в любом случае, поставщики JPA, такие как Hibernate, могут кэшировать инструкции SQL, которые они должны отправлять в базу данных, часто до тех пор, пока вы не совершите транзакцию. Например, вы вызываете em.persist(), Hibernate помнит, что он должен сделать вставку базы данных, но фактически не выполняет инструкцию, пока вы не зафиксируете транзакцию. Afaik, это в основном делается по соображениям производительности.

В некоторых случаях в любом случае вы хотите, чтобы инструкции SQL выполнялись немедленно; как правило, когда вам нужен результат некоторых побочных эффектов, таких как автогенерированный ключ или триггер базы данных.

что em.flush() does-это очистить внутренний кэш инструкций SQL и немедленно выполнить его в базе данных.

итог: никакого вреда не будет сделано, только вы можете иметь (незначительный) хит производительности, так как вы переопределяете решения поставщика JPA в отношении наилучшего времени для отправки инструкций SQL в базу данных.

на самом деле em.flush(), сделать больше, чем просто отправляет кэшированные команды SQL. Он пытается синхронизировать контекст сохранения с базовой базой данных. Это может привести к большим затратам времени на ваши процессы, если ваш кэш содержит коллекции для синхронизации.

внимание при его использовании.

Comments

    Ничего не найдено.