Когда вы изменяете сущности внутри транзакции, вы на самом деле изменяете не базу данных, а модель строк в памяти.Когда ваша транзакция будет принята, изменения в модели в памяти будут сброшены в базу данных, что означает, что будут выполнены необходимые SQL-запросы для приведения состояния базы данных в состояние модели.
При вызове entityManager.flush вручную все, что вы делаете - синхронизируете эти изменения до завершения транзакции.Это имеет несколько последствий:
- Если ваша транзакция заканчивается отменой (исключение возникает после вызова сброса), Hibernate / JPA должен будет выполнить откат базы данных, что приведет к снижению производительности.
- Если состояние вашей модели заканчивается нарушением ограничения в базе данных, ручная очистка вызовет эту ошибку на более ранней стадии.Это обычно прерывает выполнение вашей Java при вызове сброса, а не во время фиксации транзакции.
В общем случае не нужно выполнять ручную очистку.Единственный реальный выигрыш, который я вижу, это моя вторая точка здесь, где необходимо немедленно остановить выполнение, если есть нарушение ограничения.Но, на мой взгляд, это запах кода, и его легко избежать, зная, какие изменения вы можете и не можете сделать, а также правильно настроив транзакции.
Повторный вызов flush безлюбые изменения в промежуточной модели не будут иметь никакого эффекта, поскольку все изменения уже внесены в базу данных.