删除子对象会导致JDBC批处理更新异常

时间:2012-01-28 21:18:00

标签: playframework

当我尝试删除“课程”对象时,我得到了这个例外:
    Referential integrity constraint violation: "FKCE6C075833B16F41: PUBLIC.TEACHER_COURSE FOREIGN KEY(COURSES_ID) REFERENCES PUBLIC.COURSE(ID)" SQL statement: delete from Course where id=?

“课程”课程如下所示:

@Entity
public class Course extends Model {
  @ManyToOne
  public Teacher teacher;
  ...
}

“老师”课程如下所示:

@Entity
public class Teacher extends Model {
  @OneToMany(mappedBy="teacher", cascade=CascadeType.ALL)
  public List<Course> courses;
  ...
}

每当我尝试从我的控制器中删除“课程”时(使用delete()方法),我得到上面的例外。我如何解决它?我尝试了各种映射方式。我是否需要在某处修复数据库的架构?

感谢您的帮助!这是我在这里的第一篇文章,如果有什么我需要更清楚的,请告诉我!

2 个答案:

答案 0 :(得分:1)

我认为您正在尝试删除Course记录,但仍有Teacher条记录,其中包含您要删除的课程的参考(存储在{ {1}}加入表格)。这是正常,因为您已定义了双向关系:TEACHER_COURSE知道其Course,而Teacher知道Teacher个对象属于它。

一种选择是尽可能简单地摆脱双向关系(例如,通过删除Course列表删除TeacherCourse之间的关系)。另一种方法是首先从courses列表中删除要删除的Course实例,然后将其删除( note :您可能必须保留/合并{{ 1}}在删除课程之前首先列出所以没有链接了。)

This question on the matter可能会提供一些额外的见解。

答案 1 :(得分:1)

我认为您正在反向映射关系。你的映射就像是关系的父方,而不是老师。来自Hibernate docs

  

要将双向一个映射到多个,将一对多方面作为拥有方,您必须删除mappedBy元素并将多个@JoinColumn设置为可插入且可更新为false。此解决方案未经过优化,将生成一些额外的UPDATE语句。

@Entity
public class Course extends Model {
    @ManyToOne
    @JoinColumn(name="teacher_id")
    public Teacher teacher;
    ...
}

老师:

@Entity
public class Teacher extends Model {
  @OneToMany(cascade=CascadeType.ALL)
  @JoinColumn(name="teacher_id")
  public List<Course> courses;
  ...
}