2012-01-28 55 views
1

当我尝试删除“课程”的对象,我得到这个异常:
Referential integrity constraint violation: "FKCE6C075833B16F41: PUBLIC.TEACHER_COURSE FOREIGN KEY(COURSES_ID) REFERENCES PUBLIC.COURSE(ID)" SQL statement: delete from Course where id=?删除子对象导致JDBC批量更新异常

的“课程”类看起来是这样的:

@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()方法)从我的控制器中删除“课程”,我得到上面的例外。我如何解决它?我试过各种映射方法。我需要修复数据库的模式吗?

感谢您的帮助!这是我第一篇文章,如果有什么我需要更清楚的,请让我知道!

回答

1

我看来像你想删除Course记录,但仍然有是有你想删除的过程中参考(存储在TEACHER_COURSE连接表)一个Teacher记录。这是正常,因为您已经定义了双向关系:Course知道它的Teacher,而Teacher知道属于它的Course对象。

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

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

+0

我试图从列表中删除课程实例,但被证明是复杂的,我意识到我并不需要它,所以我删除的关系。但我需要阅读这些JPA文档。再次感谢! – Budgetperson 2012-01-28 22:24:56

1

我认为你是在反向映射关系。你正在映射像关系的父母一方,而不是老师。从Hibernate docs

要映射双向一对多,与一个一对多侧为所属端,你必须为插入和更新,以去除的mappedBy元素,并设置多对一@JoinColumn假。此解决方案未经优化,将生成一些额外的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; 
    ... 
}