У меня проблема с простым @OneToMany
отображением между родительским и дочерним объектом. Все работает хорошо, только дочерние записи не удаляются, когда я удаляю их из коллекции.
Родитель:
@Entity
public class Parent {
@Id
@Column(name = "ID")
private Long id;
@OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
private Set<Child> childs = new HashSet<Child>();
...
}
Ребенок:
@Entity
public class Child {
@Id
@Column(name = "ID")
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="PARENTID", nullable = false)
private Parent parent;
...
}
Если я сейчас удалю и child из набора childs, он не будет удален из базы данных. Я попытался аннулировать child.parent
ссылку, но это тоже не сработало.
Сущности используются в веб-приложении, удаление происходит как часть Ajax-запроса. У меня нет списка удаленных дочерних элементов при нажатии кнопки сохранения, поэтому я не могу удалить их неявно.
В дополнение к ответу Cletus, JPA 2.0 , последний с декабря 2010 года, вводит
orphanRemoval
атрибут@OneToMany
аннотаций. Для более подробной информации смотрите эту запись в блоге .Обратите внимание, что, поскольку спецификация является относительно новой, не все поставщики JPA 1 имеют окончательную реализацию JPA 2. Например, выпуск Hibernate 3.5.0-Beta-2 пока не поддерживает этот атрибут.
источник
Вы можете попробовать это:
@OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true)
,источник
Как было объяснено, с JPA невозможно сделать то, что я хочу, поэтому я применил аннотацию hibernate.cascade, при этом соответствующий код в классе Parent теперь выглядит следующим образом:
Я не мог просто использовать «ALL», так как это также удалило бы родителя.
источник
Здесь каскад в контексте удаления означает, что дочерние элементы удаляются, если вы удаляете родительский элемент. Не ассоциация. Если вы используете Hibernate в качестве вашего JPA-провайдера, вы можете сделать это, используя специальный каскад hibernate .
источник
Вы можете попробовать это:
или
источник
Смотрите здесь .
источник