Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
7 профессий по цене одной
07:05:47:06
дн. ч. мин. сек.
12 Фев 2024
2 мин
1162

Проблема с Hibernate и связью «all-delete-orphan»

Очень часто разработчики, работающие с Hibernate, сталкиваются с ошибкой «A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance». Данная ошибка

Очень часто разработчики, работающие с Hibernate, сталкиваются с ошибкой «A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance». Данная ошибка возникает при попытке обновления родительской сущности, имеющей коллекцию дочерних сущностей. Для примера, рассмотрим следующую конфигурацию маппинга.

@OneToMany(mappedBy = "parentEntity", fetch = FetchType.EAGER)
@Cascade({ CascadeType.ALL, CascadeType.DELETE_ORPHAN })
public Set<ChildEntity> getChildren() {
    return this.children;
}

Если производится попытка обновить родительскую сущность, то может возникнуть такая ошибка. В основе её лежит нарушение связи между родительской сущностью и коллекцией дочерних сущностей.

Для решения этой проблемы необходимо учесть некоторые моменты при работе со связанными сущностями в Hibernate. Во-первых, необходимо всегда устанавливать обе стороны связи: родительскую сущность для дочерней и коллекцию дочерних сущностей для родительской. Во-вторых, при обновлении родительской сущности, вместо того, чтобы создавать новую коллекцию дочерних сущностей, следует изменять уже существующую.

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

public void addChild(ChildEntity child) {
    child.setParentEntity(this);
    this.children.add(child);
}

public void removeChild(ChildEntity child) {
    child.setParentEntity(null);
    this.children.remove(child);
}

Таким образом, соблюдение указанных принципов позволяет избежать ошибки «A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance» при работе с Hibernate.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий