удаление сирот не работает должным образом - PullRequest
0 голосов
/ 09 июня 2018

У меня есть коллекция «один ко многим», аннотированная следующим образом:

@Entity
@Table(name = "students")
public class Student {
    @OneToMany(mappedBy = "student", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
    @OrderColumn(name ="index")
    private List<Preference> preferences;
}

Объект предпочтения

@Entity
@Table(name = "preferences")
public class Preference {
    // id
    @ManyToOne
    @JoinColumn(name = "student_id")
    private Student student;

    @ManyToOne
    @JoinColumn(name = "project_id")
    private Project project;
    private Integer index;
}

Я пытаюсь удалить элемент из списка следующим образом:

public void removePreference(Preference preference) {
    preferences.remove(preference);
    preference.setStudent(null);
}

Приведенный выше код не работает, объект не удаляется из таблицы.Как мне этого добиться?

1 Ответ

0 голосов
/ 09 июня 2018

Если предположить, что отношение Project к Preference определено так же, как Student к Preference, то ваша проблема заключается в том, что ваша сущность Preference является дочерней по отношению к двум другим сущностям.

Когда вы удаляете его из предпочтений учащегося, Hibernate помечает его как удаленный объект, но, поскольку на него все еще ссылается проект, Hibernate будет управлять им заново, как указано в спецификации JPA * 1009.* для этого варианта использования.Ознакомьтесь с разделами 3.2.2 и 3.2.3 о сохранении и удалении.

Для решения вашего дела вы можете удалить его со всех сторон или проверить, существует ли связь @ManyToMany между Student и Project с Preference так как соединительный стол не подходит лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...