Вы правы, все происходит в одной транзакции и в одном и том же сеансе Hibernate.
Сессия отслеживает каждую сущность, которой она управляет. Даже если вы попросили удалить его в базе данных, соответствующий объект все еще запоминается в сеансе до его завершения.
В общем, возможно, что
Hibernate переупорядочивает ваши операции
при отправке их в базу данных, для
причины эффективности.
Что вы могли бы сделать, это сбросить (т.е. отправить в базу данных) вашу транзакцию, поскольку при сохранении (при необходимости вы также можете очистить, т. Е. Очистить объекты, запомненные сеансом, - после сброса):
sess.flush();
// sess.clear(); // if needed or convenient for you
branchBuildingDao.save(bbe, sess);
Также обратите внимание, что, пока ваши сущности запоминаются сессией, их изменение приведет к автоматическому обновлению при закрытии сессии.
В нашем проекте у нас есть метод, который эффективно удаляет коллекцию (и еще один для массива, объявленного с использованием удобного синтаксиса параметра ...
) сущностей (он работает для всех сущностей, этого не нужно делать для каждой сущности), удалив их из сеанса одновременно и позаботившись о сбрасывании до:
- Цикл для всех объектов, удалить его (используя
sess.delete(e)
) и добавить его в список «удаленных».
- Каждые 50 объектов (соответствующих размеру пакета, который мы настроили для повышения эффективности) (и в конце):
- сбросить сеанс, чтобы Hibernate немедленно отправил изменения в базу данных,
- цикл в списке «удаленных», очистить каждую сущность от сеанса (используя
sess.evict(e)
).
- очистить список удаленных пользователей.
Не волнуйтесь, flush только отправляет SQL в базу данных. Он все еще подлежит фиксации или откату.