2014-01-15 49 views
0

當Hibernate(或其他JPA實現)爲@OneToMany關係創建外鍵時,是否有辦法迫使它在數據庫級別使用ON DELETE CASCADE?我發現,當我使用CascadeType.DELETE時,Hibernate不會在數據庫級別執行此操作,而是會發送兩個刪除語句(用於父級和子級記錄)。或者也許有一個很好的理由呢?強制Hibernate使用ON DELETE CASCADE創建外鍵

回答

2

在Hibernate中,您可以在@OneToMany關係使用

@OnDelete(action = OnDeleteAction.CASCADE) 

。這告訴hibernate爲生成的外鍵設置ON DELETE CASCADE。

請注意,這是一個hibernate擴展,並未在JPA標準中指定。

請謹慎使用。當您讓數據庫級聯刪除時,這些會發生在休眠控制之外:

  • 您的二級緩存可能會失去同步。
  • 你不能使用刪除這些實體的偵聽器。

我想你應該只使用這個,如果你有一個大的集合和性能的考慮迫使你讓數據庫處理刪除而不是休眠。

0

他們不是一回事。 JPA級聯遍歷向下對象圖,而數據庫外鍵行爲有效地遍歷對象圖。例如,讓我們說你有一對單向關係

class House { 

    @OneToOne 
    Object door; 

} 

如果使用CascadeType.REMOVE然後刪除房子也將刪除門。

@OneToOne(cascade=CascadeType.REMOVE) 
    Object door; 

如果您使用@O​​nDelete,那麼刪除門也會刪除房屋。

@OneToOne 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    Object door; 

在這裏閱讀更多:http://www.ninthavenue.com.au/jpa-cascadetype-remove-vs-hibernate-ondelete