При удалении установите значение null в спящем режиме в @OneToMany
У меня есть объект отдела, который имеет следующие отношения:
-
Многие отделы могут находиться в одном родительском отделе:
@ManyToOne
@JoinColumn(name = "ik_parent_department_id")
private Department parentDepartment;
-
Один родительский отдел может иметь многие отделы:
@OneToMany(mappedBy = "parentDepartment")
private Set children = new HashSet(0);
и я хочу, чтобы при удалении отдела все дети этого отдела, Для параметра ik_parent_department_id установлено значение null и идеи, как это сделать?
Ответы
Ответ 1
Вам нужно установить для детей ik_parent_department_id
значение null явно.
Department parentDepartment = (Department) session.load(Department.class, id);
session.delete(parentDepartment);
for (Department child : parentDepartment.getChildren()){
child.setParentDepartment(null);
}
session.flush();
При каскадировании вам удастся удалить дочерний элемент Departments
.
Ответ 2
Просто введите код:
for (Department child : parent.getChildren()) {
child.setParentDepartment(null);
}
session.delete(parent);
Ответ 3
С JPA, в родительском Entity
у вас может быть что-то вроде
@OneToMany(mappedBy="parent", cascade={CascadeType.PERSIST})
Collection<Child> children;
и во избежание повторения "set null code" и исключений нарушения целостности в родительском методе удаления в родительском Entity
также
@PreRemove
private void preRemove() {
children.forEach( child -> child.setParentnull));
}