首页 > 解决方案 > 孤儿删除无法正常工作

问题描述

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

@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);
}

上面的代码不起作用,实体没有从表中删除。我怎样才能做到这一点?

标签: javahibernate

解决方案


假设ProjecttoPreference关系的定义方式与StudenttoPreference那么您的问题来自您的Preference实体是其他两个实体的子实体的事实相同。

当您从学生的偏好中删除它时,它被 Hibernate 标记为已删除的实体,但由于它仍被项目引用,Hibernate 将重新管理它,正如JPA 规范中针对此用例所指定的那样。查看第 3.2.2 和 3.2.3 节关于持久化和删除的信息。

要解决您的问题,您可以从所有方面删除它,或者检查连接表之间的关系是否@ManyToMany不适合。StudentProjectPreference


推荐阅读