Если родительский объект начинается со списка из 3 дочерних объектов, удаляет дочерний 1 и вызывает session.update (parent), какой тип отображения гибернации мне потребуется для очистки родительского PK из удаленной дочерней таблицы безПолное удаление удаленного потомка?
У меня также есть ограничение, которое запрещает удаление любого родителя, если ему назначен какой-либо дочерний объект, и другое ограничение, которое предотвращает случайное каскадное удаление любых дочерних записей.
Я могу успешно каскадно обновить дочерние элементы, просто вызвав session.update (parent), но у меня возникают проблемы с выполнением обратного действия.
public class Parent implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private List<Child> children;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@OneToMany(mappedBy = "parent")
@org.hibernate.annotations.Cascade(
value = {org.hibernate.annotations.CascadeType.SAVE_UPDATE})
public List<Child> getChildren() {
return children;
}
public void setChildren(List<Child> children){
this.children = children;
for(Child child : children) {
child.setParent(this);
}
}
//----------------- Would I need something like this? ---------------
//----------------- Or does hibernate have a better way? ---------------
public void setChildren(List<Child> children){
for(Child child : this.children)
if (!children.contains(child)) {
child.setParent(null);
}
}
this.children = children;
for(Child child : children) {
child.setParent(this);
}
}
//----------------------------------------------------------------
}
public class Child implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private Parent parent;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@ManyToOne
public Parent getParent() {
return parent;
}
public void setParent(Parent parent) {
this.parent = parent;
}
}
Это решение похоже, но я не удаляю Parentвместо этого я удаляю дочерний элемент из списка:
каскад гибернации - обновите дочерний элемент до нуля