【发布时间】:2012-04-14 04:58:27
【问题描述】:
我已经能够让 JPA/Hibernate 成功复制 ON DELETE CASCADE 功能(似乎是默认行为),但我现在正在尝试复制 ON 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 批量更新; SQL [delete from teacher whereteacher_id=?];约束 [null]
...
原因:org.hibernate.exception.ConstraintViolationException:无法执行 JDBC 批量更新
...
原因:java.sql.BatchUpdateException:批量条目 0 从teacher_id='1'被中止的教师中删除。调用 getNextException 查看原因。
我做错了吗?是不是可以实现?
谢谢。
【问题讨论】:
-
您想将该记录的所有列设置为 null 吗?或学生实体的所有字段
-
我希望在将
student的teacher从系统中删除后,student的teacher列变为null。 -
并不是说您想更改 JPA 的架构,但我很好奇将其更改为对连接表进行级联删除的 ManyToMany 的效果。它应该删除关联并离开学生。