Подтвердить что ты не робот

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.

С уважением, Андрей

4b9b3361

Ответ 1

Для JPA 2.0 вы можете установить orphanRemoval=true @OneToMany

Для JPA 1.0 вы должны использовать аннотации, связанные с гибернацией. Это аннотация @Cascade (вместо атрибута cascade) со значением

@Cascade({CascadeType.ALL, CascadeType.DELETE_ORPHAN})

Hibernate 3.5+ реализует JPA 2.0