2012-01-28 77 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; 
    ... 
}