2012-11-02 18 views
1

我在我的數據庫中有三個表;一個作者表,它具有一個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,但我得到相同的錯誤。

我可以使用哪些註釋來指示當從作者的書集中刪除書籍時,我希望書桌中的那一行被刪除?這可能與我如何建立我的關係有關,如果沒有,那麼有什麼更好的方法來解決這個問題?

回答

1

在數據庫中的AuthorId列設置爲NOT NULL?可能是因爲Hibernate會在兩遍中刪除行。第一遍刪除外鍵引用,第二遍刪除該行。我使用NHibernate,並且已經看到類似的行爲。如果是這種情況,那麼您應該能夠通過將AuthorId設置爲無效來對問題進行排序。

+0

現貨!我曾假設Hibernate會簡單地刪除這些行,但它不會發生在我身上,它可能需要更長的路由,方法是將null和_then_刪除。這似乎有點奇怪,因爲理想情況下,我想通過將authorId設置爲非空來確保沒有作者沒有任何書籍,但是我想我必須確保其餘代碼具有完整性以實現此目的。感謝你及時的答覆! –

相關問題