При удалении установите ноль в спящем режиме в @OneToMany - PullRequest
18 голосов
/ 23 ноября 2011

У меня есть отдел отдела, отношения которого следующие:

  1. Многие отделы могут находиться в одном родительском отделе :

    @ManyToOne
    @JoinColumn(name = "ik_parent_department_id")
    private Department parentDepartment;
    
  2. Один родительский отдел может иметь много отделов :

    @OneToMany(mappedBy = "parentDepartment")
    private Set<Department> children = new HashSet<Department>(0);
    

И я хочу реализовать следующее: Когда я удаляю отдел , тогда параметр ik_parent_department_id для всех потомков этого отдел имеет значение ноль . Есть идеи как это сделать?

Ответы [ 3 ]

10 голосов
/ 23 ноября 2011

Вам придется явно установить для детей 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.

5 голосов
/ 23 ноября 2011

Просто код:

for (Department child : parent.getChildren()) {
    child.setParentDepartment(null);
}
session.delete(parent);
2 голосов
/ 22 ноября 2017

С JPA, в родительском Entity у вас может быть что-то вроде

@OneToMany(mappedBy="parent", cascade={CascadeType.PERSIST})
Collection<Child> children;

и во избежание возможного повторения «установки нулевого кода» и исключений нарушения целостности при реализации родительского удаления в родительском Entity также

@PreRemove
private void preRemove() {
   children.forEach( child -> child.setParentnull));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...