Jpa удаление ребенка из коллекции
Я использую JPA через Hibernate в своем веб-приложении. Вот два объекта (показаны только геттеры):
class Child {
private Parent parent;
@ManyToOne(optional=false)
@JoinColumn(name="parent_id", referencedColumnName="parent_id", nullable=false, updatable=false)
public Parent getParent() {
return parent;
}
}
class Parent {
private Collection children;
@OneToMany(fetch=FetchType.EAGER, mappedBy="parent", cascade={CascadeType.ALL})
public Collection getChildren() {
return children;
}
}
Как вы видите, Parent
и Child
относятся как "один ко многим".
Теперь мне нужно загрузить экземпляр Parent
, удалить некоторых или всех детей и сохранить изменения. Ниже приведен код, который не работает для меня:
Parent p = entityManager.find(Parent.class, 12345L); // load entity
p.getChildren().clear(); // remove all children
entityManager.merge(p); // try to save
В приведенном выше примере дочерние объекты не удаляются. Теперь мне нужно вручную вызвать entityManager.remove()
для каждого дочернего элемента.
Есть ли более простой способ управлять дочерней коллекцией? Обратите внимание, что я не хочу использовать функциональные возможности Hibernate, только чистую JPA.
С уважением,
Андрей
Ответы
Ответ 1
Для JPA 2.0 вы можете установить orphanRemoval=true
@OneToMany
Для JPA 1.0 вы должны использовать аннотации, связанные с гибернацией. Это аннотация @Cascade
(вместо атрибута cascade
) со значением
@Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN})
Hibernate 3.5+ реализует JPA 2.0