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

При удалении установите значение 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 и идеи, как это сделать?

4b9b3361

Ответ 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));
}