TGViewer
Java библиотека Java библиотека @javalib · 30.6K subscribers
Post #7690 1.17K
🌞 Hibernate выполняет SQL не в том порядке, в котором ты его написал

Код читается сверху вниз, а Hibernate так не работает. При flush'е Hibernate складывает все действия в ActionQueue и выполняет их в строго фиксированном порядке по типу операции, а не по порядку вызова в коде:

1. orphan removal
2. INSERT
3. UPDATE
4. удаление коллекций
5. обновление коллекций
6. вставка коллекций
7. DELETE


Классический пример с unique-ограничением:

repo.delete(oldRow);     // (1) в коде сначала удаляем
repo.save(newRow); // (2) потом вставляем с тем же unique-значением
// commit -> ConstraintViolationException


На flush Hibernate переставит это в INSERT → DELETE. Вставка отработает до удаления, ловит конфликт по уникальному ключу, и падает, хотя в твоём коде последовательность была валидной.

🟡 Варианты решения:

— явный flush() между операциями, чтобы зафиксировать порядок;
— deferred (отложенные) constraints на стороне БД;
— пересмотр модели, чтобы коллизии в принципе не возникало.

Главное не считать, что порядок методов = порядок SQL. Это не так (для Hibernate).

Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪
  • 👍 8
  • ❤ 3
  • 🔥 2
More from @javalib
  1. Sep 27, 2026Запускаем внешнюю команду через ProcessBuilder! Иногда Java-приложению нужно вызвать систе…
  2. Sep 27, 2026👩‍💻 Как сделать Java-сервис устойчивее к сбоям Resilience4j добавляет готовые паттерны C…
  3. Sep 27, 2026Java: используйте Deque вместо Stack для работы по принципу LIFO («последним пришёл — перв…
  4. Sep 26, 2026Post #7686
  5. Sep 26, 2026Spring Boot 4: как перенести старые настройки При обновлении добавьте временную зависимост…
  6. Sep 26, 2026Post #7684
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →