У меня возникла следующая проблема при попытке обновить мою сущность:
"A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance".
У меня есть родительский объект, и у него есть Set<...>
несколько дочерних объектов. Когда я пытаюсь обновить его, я получаю все ссылки на эти коллекции и устанавливаю его.
Следующий код представляет мое отображение:
@OneToMany(mappedBy = "parentEntity", fetch = FetchType.EAGER)
@Cascade({ CascadeType.ALL, CascadeType.DELETE_ORPHAN })
public Set<ChildEntity> getChildren() {
return this.children;
}
Я пытался очистить только Set <..>, в соответствии с этим: Как «возможно» решить проблему, но это не сработало.
Если у вас есть идеи, пожалуйста, дайте мне знать.
Спасибо!
java
hibernate
hibernate-mapping
axcdnt
источник
источник
something.manyother.remove(other)
еслиmanyother
этоList<T>
. Сделайте много других изменчивых, какArrayList<T>
и использоватьorphanDelete = true
Ответы:
Проверьте все места, где вы назначаете что-то sonEntities. Ссылка, на которую вы ссылались, четко указывает на создание нового HashSet, но эта ошибка может появиться при каждом переназначении набора. Например:
Обычно вы хотите «новый» набор только один раз в конструкторе. Каждый раз, когда вы хотите добавить или удалить что-то в списке, вы должны изменить содержимое списка, а не назначать новый список.
Чтобы добавить детей:
Чтобы удалить детей:
источник
Метод:
работает, если
parentEntity
отсоединен и снова, если мы обновляем его.Но если сущность не отделена от контекста (то есть операции поиска и обновления выполняются в одной транзакции), работает приведенный ниже метод.
источник
Когда я читал в разных местах, что hibernate не хотел, чтобы вы назначали коллекцию, я предполагал, что самым безопасным, очевидно, было бы сделать его окончательным, как это:
Однако это не сработает, и вы получите страшную ошибку «больше не ссылается», которая в данном случае на самом деле вводит в заблуждение.
Оказывается, что hibernate вызывает ваш метод setRoles и хочет, чтобы здесь был установлен специальный класс коллекции, и не будет принимать ваш класс коллекции. Это поставило меня в тупик на долгое время, несмотря на то, что я прочитал все предупреждения о не назначении вашей коллекции в вашем методе set.
Итак, я изменился на это:
Таким образом, при первом вызове hibernate устанавливает свой специальный класс, а при последующих вызовах вы можете использовать метод самостоятельно, не разрушая все. Если вы хотите использовать свой класс в качестве bean-компонента, вам, вероятно, нужен работающий установщик, и это, по крайней мере, похоже, работает.
источник
List<String> list = new ArrayList<>();
. Изменяя его, чтобыList<String> list = null;
решить проблему :)На самом деле, моя проблема была о равных и хэш-коде моих сущностей. Устаревший код может принести много проблем, не забудьте проверить его. Все, что я сделал, это просто сохранил стратегию удаления-сироты и исправил равно и хэш-код.
источник
У меня была такая же ошибка. Проблема для меня заключалась в том, что после сохранения сущности сопоставленная коллекция была все еще нулевой, и при попытке обновить сущность было сгенерировано исключение. Что мне помогло: сохранение сущности, затем обновление (коллекция больше не равна нулю) и затем обновление. Может быть, инициализация коллекции с новым ArrayList () или что-то может также помочь.
источник
ИМЕЕТ ОТНОШЕНИЕ ТИПА:
Не пытайтесь создавать экземпляр коллекции, когда она объявлена
hasMany
, просто добавляйте и удаляйте объекты.ТИП ИСПОЛЬЗОВАНИЯ:
Но коллекция может быть нулевой только тогда, когда она объявлена как свойство (отношение использования) и не инициализирована в объявлении.
источник
Я использовал @ user2709454 подход с небольшим улучшением.
источник
У меня была эта проблема при попытке использования
TreeSet
. Я сделал инициализацию,oneToMany
сTreeSet
которой работаетНо это приведет к ошибке, описанной
question
выше. Так что кажется, чтоhibernate
поддерживается,SortedSet
и если просто изменить строку выше наэто работает как по волшебству :) больше информации
hibernate SortedSet
можно здесьисточник
Единственный раз, когда я получаю эту ошибку, это когда я пытаюсь передать NULL в сеттер для коллекции. Чтобы предотвратить это, мои сеттеры выглядят так:
источник
Я столкнулся с этим при обновлении сущности с помощью пост-запроса JSON. Ошибка произошла, когда я обновил сущность без данных о дочерних элементах, даже когда их не было. Добавление
чтобы тело запроса решило проблему.
источник
Еще одной причиной может быть использование ломбок.
@Builder
- причины для сохранения,Collections.emptyList()
даже если вы говорите.myCollection(new ArrayList());
@Singular
- игнорирует значения класса по умолчанию и покидает поле,null
даже если поле класса было объявлено какmyCollection = new ArrayList()
Мои 2 цента, просто провели 2 часа с таким же :)
источник
Я получал,
A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance
когда я сиделparent.setChildren(new ArrayList<>())
. Когда я изменился наparent.getChildren().clear()
, это решило проблему.Проверьте более подробную информацию: HibernateException - Коллекция с cascade = "all-delete-orphan" больше не упоминалась экземпляром объекта-владельца .
источник
Я использую Spring Boot, и у меня возникла эта проблема с коллекцией, несмотря на то, что она не перезаписывалась напрямую, потому что я объявляю дополнительное поле для той же коллекции с помощью настраиваемого сериализатора и десериализатора , чтобы обеспечить более дружественное для внешнего интерфейса представление данные:
Кажется, что даже если я не перезаписываю коллекцию сам , десериализация делает это под капотом, вызывая эту проблему все же. Решением было изменить установщик, связанный с десериализатором, чтобы он очистил список и добавил все, а не перезаписал его:
источник
У меня была та же самая проблема, но это было, когда набор был нулевым. Только в коллекции Set в списке работы найди. Вы можете попробовать аннотацию в спящем режиме @LazyCollection (LazyCollectionOption.FALSE), вставленную из аннотации JPA fetch = FetchType.EAGER.
Мое решение: это моя конфигурация и отлично работает
источник
Я столкнулся с той же ошибкой при добавлении дочернего объекта в существующий список дочерних объектов.
То, что решило мою проблему, меняется на:
Теперь ребенок оживает и с другими деталями, и он работал нормально.
источник
Добавляю мой тупой ответ. Мы используем Spring Data Rest. Это были наши довольно стандартные отношения. Шаблон был использован в другом месте.
С созданными нами отношениями всегда предполагалось, что дети будут добавлены через их собственный репо. Я еще не добавил репо. Наш интеграционный тест проходил полный жизненный цикл объекта с помощью вызовов REST, поэтому транзакции закрывались между запросами. Отсутствие репо для ребенка означало, что у json дети были частью основной структуры, а не in
_embedded
. Обновление родительского элемента может вызвать проблемы.источник
Следующее решение сработало для меня
источник
Вместо назначения новой коллекции
Заменить все элементы на
источник
будь осторожен с
Этот метод тоже нарушает спящий режим.
источник
Это может быть вызвано
hibernate-enhance-maven-plugin
. Когда я включилenableLazyInitialization
свойство, это исключение началось в моей ленивой коллекции. Я использую hibernate 5.2.17. Наконец.Обратите внимание на две проблемы гибернации:
источник
Мой был совершенно другим с Spring Boot! Для меня это не было связано с установкой свойства коллекции.
В своих тестах я пытался создать сущность и получал эту ошибку для другой неиспользованной коллекции!
После стольких попыток я просто добавил
@Transactional
тестовый метод, и он решил это. Хотя нет причины.источник
Это в отличие от предыдущих ответов, у меня была точно такая же ошибка: «Коллекция с cascade =” all-delete-orphan ”больше не упоминалась ....», когда моя функция установки выглядела так:
И затем он исчез, когда я изменил его на простую версию:
(Версии hibernate - пробовал и 5.4.10 и 4.3.11. Потратил несколько дней, пробуя всевозможные решения, прежде чем вернуться к простому назначению в установщике. Теперь смущен, почему это так.)
источник