Очень часто разработчики, работающие с 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.
Перейти в телеграм, чтобы получить результаты теста



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