【问题标题】:Deleting a child Object leads to a JDBC Batch Update Exception删除子对象会导致 JDBC 批量更新异常
【发布时间】:2012-01-30 11:14:35
【问题描述】:

当我尝试删除“课程”对象时,出现以下异常:
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() 方法),我都会遇到上述异常。我如何解决它?我尝试了各种映射方式。我需要在某处修复数据库的架构吗?

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

【问题讨论】:

    标签: playframework


    【解决方案1】:

    在我看来,您正在尝试删除 Course 记录,但仍有一条 Teacher 记录引用了您要删除的课程(存储在 TEACHER_COURSE 连接表中)。这是正常,因为您已经定义了一个双向关系:Course 知道它的Teacher,而Teacher 知道属于它的Course 对象。

    如果可能,一种选择是简单地摆脱双向关系(例如,通过删除courses 列表来删除从TeacherCourse 的关系)。另一种方法是先从courses 列表中删除要删除的Course 实例,然后再将其删除(注意:您可能必须先保留/合并courses 列表删除课程,因此不再有链接)。

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

    【讨论】:

    • 我试图从列表中删除 Course 实例,但事实证明这很复杂,我意识到我不需要它,所以我删除了关系。但我需要阅读那些 JPA 文档。再次感谢!
    【解决方案2】:

    我认为您正在反向映射关系。您正在映射课程是关系的父方,而不是教师。来自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;
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-01
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 2014-02-07
      • 1970-01-01
      相关资源
      最近更新 更多