Когда вы выполняете entity.setElements(newCollection)
в Java, вы фактически заменяете существующую коллекцию новой.Что происходит с элементами, которые были в существующей коллекции?Они становятся сиротой .Затем сборщик мусора вступает в действие и удаляет (т.е. освобождает используемую память) потерянные объекты .Все это происходит в ОЗУ, это поток, работающий в JRE, пока база данных не задействована.
К сожалению, в реляционных базах данных нет ничего похожего на сборщик мусора.Вы (или в этом случае Hibernate) должны явно удалить потерянные записи , используя оператор delete
.
Поэтому Hibernate будет запускать оператор удаления для каждого Collection.remove()
или Collection.clear()
.
Кроме того, Hibernate не может перехватить действие сборщика мусора JRE, чтобы вызвать собственный набор операторов delete
.Поэтому, когда вы делаете entity.setElements(newCollection)
, Hibernate обнаруживает, что предыдущая коллекция была собрана сборщиком мусора, но уже слишком поздно, она больше не имеет ссылки на объекты oprhan, поэтому она не может делать операторы delete
.