2010-08-13 90 views
3

我對@OneToMany和@ManyToOne註釋存在一些問題。休眠,持久性和@OneToMany以及@ManyToOne註釋問題

我有兩個類Suite和SuiteVersion。 SuiteVersion取決於套件。所以,我在我的代碼實現這一點:

類套房:

@OneToMany(mappedBy = "suite") 
@Cascade(CascadeType.DELETE_ORPHAN) 
private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>(); 

類SuiteVersion:

@ManyToOne() 
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE}) 
private Suite suite; 

但我有一些問題,當我刪除其套房有SuiteVersion有關。 休眠不Suite.I之前刪除SuiteVersion不知道爲什麼,因爲我已經在我的代碼提到了這一點:

@Cascade(CascadeType.DELETE_ORPHAN) 

這是我獲得當我刪除套房日誌:

Hibernate: delete from SUITE where ID_SUITE=? 13 août 2010 09:40:50 org.hibernate.util.JDBCExceptionReporter logExceptions ATTENTION: SQL Error: -8, SQLState: 23504 13 août 2010 09:40:50 org.hibernate.util.JDBCExceptionReporter logExceptions GRAVE: integrity constraint violation: foreign key no action; FK42895651EA304E6 table: SUITE_VERSION

謝謝你提前尋求你的幫助。

最好的問候,

弗洛朗,

P.S:對不起,我的英語我是法國人。

回答

2

But i have some problem when i delete a Suite whose have SuiteVersion associated. Hibernate don't delete SuiteVersion before Suite .

那是因爲你不級聯REMOVE操作從SuiteSuiteVersion。爲了獲得期望的結果,你需要像這樣(假設你使用JPA 1.0):

@OneToMany(mappedBy = "suite", cascade = javax.persistence.CascadeType.REMOVE) 
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>(); 

我用完全合格的名稱清楚地顯示Hibernate的具體和這裏的標準JPA註解。

Hibernate的具體CascadeType.DELETE_ORPHAN是別的東西,它被用來告訴Hibernate 刪除特定SuiteVersion如果從集合刪除它(沒有它,SuiteVersion記錄將被更新,刪除鏈接到父Suite但會留在桌子上,因此是一個「孤兒」)。

請注意,如果您使用的是JPA 2.0(即Hibernate 3.5+),現在有一個標準方法來處理孤立記錄,即不使用Hibernate特定的註釋。您可以在您的OneToMany(和OneToOne)關聯中指定orphanRemoval選項。像這樣:

@OneToMany(mappedBy = "suite", cascade = CascadeType.REMOVE, orphanRemoval = true) 
private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>(); 

但是這超出了這個問題,因爲這實際上不是你要找的東西。

+0

你說得對。當您從集合中刪除關聯的實體時,DELETE_ORPHAN正常工作。 (+1) – 2010-08-13 14:59:06

+0

謝謝,這對我有很大的幫助。但是在我學習你的文章之前,我有理由轉向jpa 2.0。在文章的最後,你會談到處理孤兒的新標準方法。你能解釋我這種處理這個孤兒的新方法嗎? – Delildor 2010-08-13 15:36:22

+0

@Delildor:不客氣。關於使用JPA 2.0的孤兒,請參閱我的更新。 – 2010-08-13 16:17:45