我在我的數據庫中有三個表;一個作者表,它具有一個id列,一個發佈者表,它具有一個id列和一個Book表,它具有一個id列,一個authorId外鍵列,作者id和一個publisherId外鍵列,發佈商ID。更新/刪除選項上的外鍵全部設置爲'NO ACTION',但從我的理解來看,Hibernate應該能夠處理這些問題。我如何告訴Hibernate通過外鍵指向的實體刪除表格行?
作者實體有一組書籍,其中包含發佈者ID,但不知道作者。我此設置如下:
@Entity
@Table(name="author")
public class Author {
private Integer id;
private Set<Book> books;
@Id @GeneratedValue
public Integer getId() {
return id;
}
@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL) {
@JoinColumn(name="authorId")
public Set<Book> getBooks() {
return books;
}
public void setBooks(Set<Book> books) {
this.books = books;
}
}
@Entity
@Table(name="book") {
private Integer id;
private Integer publisherId;
@Id @GeneratedValue
public Integer getId() {
return id;
}
@ManyToOne(FetchType.EAGER)
@JoinColumn(name="publisherId")
public Integer getPublisherId() {
return publisherId;
}
public void setPublisherId(Integer publisherId) {
this.publisherId = publisherId;
}
}
我的問題是,當我試圖從作者的帳套刪除圖書,Hibernate試圖更新的AuthorID外鍵爲空,而我得到的錯誤在book表中,authorId列不能爲null。我想要發生的是該行被完全刪除。
我也嘗試在OneToMany註釋中添加'orphanRemoval = true',並在update/on上設置爲Cascade,但我得到相同的錯誤。
我可以使用哪些註釋來指示當從作者的書集中刪除書籍時,我希望書桌中的那一行被刪除?這可能與我如何建立我的關係有關,如果沒有,那麼有什麼更好的方法來解決這個問題?
現貨!我曾假設Hibernate會簡單地刪除這些行,但它不會發生在我身上,它可能需要更長的路由,方法是將null和_then_刪除。這似乎有點奇怪,因爲理想情況下,我想通過將authorId設置爲非空來確保沒有作者沒有任何書籍,但是我想我必須確保其餘代碼具有完整性以實現此目的。感謝你及時的答覆! –