2012-03-08 60 views
1

我有播放列表實體,擁有使用CascadeType.All註釋的剪輯集合。雖然實際上它是雙向關係,但我將其定義爲單向避免級聯。因此剪輯具有playlistId整數屬性,不參考播放列表。剪輯被定義爲播放列表的一部分,所以沒有它就無法存在。因此,DB中的'Playlist_ID'列也被定義爲非null,getPlayListId()也是如此。我讀到,如果我從集合中刪除項目,級聯認爲它是刪除關係,但不是刪除實體。在我的情況下,這是一個問題,因爲級聯試圖將Playlist_ID列設置爲null並導致違反約束。 Hibernate用null更新子實體而不刪除,如何強制它?

我想要的代碼:
playlist.getClips()除去(0);。 dao.update(播放列表)
將刪除剪輯。有什麼辦法可以做到嗎?

+0

你可以告訴我們的實體和映射 – simonC 2012-03-08 14:35:30

回答

1

你應該使用orphanRemoval:

@Entity 
public class Playlist { 

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
private List<Clip> clips; 

} 
+0

在我的理解中,orphanRemoval的意思是說,如果我刪除了播放列表並且有剪輯,那麼它沒有鏈接到任何其他播放列表,剪輯將被刪除。在我的情況下,我不會刪除播放列表。我的工作流程是:剪輯從收藏中刪除,保存收藏的播放列表。在這種情況下,休眠嘗試從播放列表中分離剪輯而不刪除它,我希望該級聯會刪除該剪輯。 – 2012-03-08 21:58:40

+0

刪除播放列表和剪輯之間的關係時使用OrphanRemoval。當發生這種情況時,移除整個播放列表當然是一個用例。從列表中刪除剪輯是另一個 - 在這兩種情況下,orphanRemoval都會導致刪除該剪輯。從[JPA文檔](http://docs.oracle.com/javaee/6/api/javax/persistence/OneToMany.html):_(可選)是否將刪除操作應用於已從關係並將刪除操作級聯到這些實體._ – 2012-03-09 08:52:53

+0

它不起作用。當我添加'orphanRemoval'時,它會根據需要將刪除操作添加到批處理中,但它也會在之前添加更新操作,並且由於違反約束而仍然失敗 – 2012-03-11 15:25:15

1

如果您使用的inverse=true老HBM符號,它會工作,你希望它的工作方式。如果您使用的是Hibernate註釋,則說明inverse=true的新方法是在父級使用mappedBy

將適當的映射添加到您的剪輯對象的播放列表成員字段。如果您對您的播放列表實體@JoinColumn註釋,註釋出來,並在你的@OneToMany註釋,加mappedBy="whateverYourPlaylistVariableIsCalled"

屬性這將告訴Hibernate不更新,只有當你打破的關係刪除。

相關問題