Недавно я столкнулся с интересной проблемой. Я использую в проекте JPA + Hibernate + EJB. Проблема заключается в сохранении и удалении объектов в одной транзакции. Используемая таблица базы данных имеет уникальное ограничение, определенное на двух столбцах.Порядок операций EntityManager
Что я делаю, это удаление сущности, призывающую
entityManager.remove();
то новый объект добавляется с теми же значениями в двух свойств, связанных с колоннами, используемых в ограничении уникальности, но разные значения других свойств с помощью:
entityManager.persist();
Эти две операции выполняются в одной транзакции и выполняются в порядке, указанном выше. Снятие сначала, добавление второго. Однако, похоже, что операции выполняются в инвертированном порядке по мере нарушения уникального ограничения. Похоже, что новый объект добавляется перед удалением предыдущего.
Очевидно, что я могу назвать
entityManager.flush()
после удаления, а затем ограничение не нарушалось. Однако в этом случае данные сохраняются в базе данных до совершения всей транзакции. Это нежелательное поведение. Если что-то пойдет не так после флеша, и транзакция будет отмечена для отката, сущность будет удалена в любом случае.
Я думал, что порядок операций такой же, как и в транзакции. Из моего примера получается, что это не так.
Есть ли способ решить проблему без промывки или совершения транзакции после удаления?
спасибо.
Я использую JTA, и я использую базу данных транзакций (Oracle), поэтому все должно быть хорошо. Блестящее объяснение Андрея. Я ошибся в вопросе о совершении транзакции. Теперь понятно. Я думаю, что вопрос и ответ будут полезны и для других людей. Спасибо. – Damian