孤儿删除工作不正常

时间:2018-06-09 16:46:38

标签: java hibernate

我有一个一对多的集合,注释如下

@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 :(得分:0)

假设ProjectPreference关系的定义方式与StudentPreference的方式相同,那么您的问题来自于您的Preference实体是另外两个实体的孩子。

当你从学生的偏好中删除它时,它被Hibernate标记为已删除的实体,但是仍然被项目引用,Hibernate将重新管理它,因为它在{{3}中指定对于这个用例。检查有关保持和删除的第3.2.2和3.2.3节。

要解决您的情况,您可以从各方面删除它,或检查@ManyToManyStudentProject之间的Preference关系作为联接表是否不会更适合。