使用 JPA/休眠来复制“删除时设置 NULL”功能

2022-09-01 02:37:16

我已经能够让JPA / Hibernate成功复制功能(似乎是默认行为),但我现在正在尝试复制该功能,并且我遇到了问题。ON DELETE CASCADEON DELETE SET NULL

这是我的两个类:

@Entity
@Table(name = "teacher")
public class Teacher
{
    @Id
    @GeneratedValue
    @Column(name = "id", nullable = false, length = 4)
    private int id;

    @OneToMany(mappedBy = "teacher")
    private List<Student> studentList;

    // ...
}

@Entity
@Table(name = "student")
public class Student
{
    @Id
    @GeneratedValue
    @Column(name = "id", nullable = false, length = 4)
    private int id;

    @ManyToOne(optional = true)
    @JoinColumn(name = "teacher_id", nullable = true)
    private Teacher teacher;

    // ...
}

当我尝试删除教师时,出现以下错误:

org.springframework.dao.DataIntegrityViolationException: 無法執行 JDBC batch update;SQL [从教师中删除,其中teacher_id=?];约束 [空]
...
由以下原因导致:org.hibernate.exception.ConstraintViolationException: 无法执行 JDBC 批量更新
...
由以下原因导致:java.sql.BatchUpdateException:批处理条目 0 从教师中删除,其中 teacher_id='1' 已中止。调用 getNextException 查看原因。

我做错了什么吗?这是可以实现的吗?

谢谢。


答案 1

目前看来,使用jpa/hibernate是不可能的。

删除时 在休眠状态中设置 null @OneToMany

JBs解决方案似乎很干净:

for (Department child : parent.getChildren()) {
    child.setParentDepartment(null);
}
session.delete(parent);

您还应该能够将其放在“预删除”中:

@PreRemove
private void preRemove() {
    for (Student s : studentList) {
        s.setTeacher(null);
    }
}

答案 2

如何定义

@ForeignKey(name = "fk_student_teacher",
            foreignKeyDefinition = " /*FOREIGN KEY in sql that sets ON DELETE SET NULL*/")

?


推荐