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