Почему нельзя установить новую коллекцию в спящем режиме? - PullRequest
0 голосов
/ 01 октября 2018

В некоторых случаях в моем опыте я обнаружил, что следующее использование является неправильным:

entity.setElements(newCollection);

И я получаю ошибку, подобную этой:

"Коллекция с каскадом =” all-delete-orphan »больше не использовался экземпляром объекта-владельца».
Так что я должен переписать это так:

entity.getElements().clear();
entity.getElements().addAll(newCollection)

Не могли бы вы объяснить, почему это происходит?

Это проблема, связанная только с сиротами?

1 Ответ

0 голосов
/ 01 октября 2018

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

К сожалению, в реляционных базах данных нет ничего похожего на сборщик мусора.Вы (или в этом случае Hibernate) должны явно удалить потерянные записи , используя оператор delete.

Поэтому Hibernate будет запускать оператор удаления для каждого Collection.remove() или Collection.clear().

Кроме того, Hibernate не может перехватить действие сборщика мусора JRE, чтобы вызвать собственный набор операторов delete.Поэтому, когда вы делаете entity.setElements(newCollection), Hibernate обнаруживает, что предыдущая коллекция была собрана сборщиком мусора, но уже слишком поздно, она больше не имеет ссылки на объекты oprhan, поэтому она не может делать операторы delete.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...