2011-11-25 75 views
1

我有一個基類,A,和兩個子類,BC。我有一個B的實例,我試圖更新並將其類型更改爲C。包含更新數據的C的實例是暫時的,因爲我無法想象有修改持久實例的方法。休眠加入子類更新

當瞬態實例從前端傳遞到服務層時,會話開始並進行一些檢查以確保它是有效的操作。在此會話期間,檢索持久實例(B)。假設一切都檢出,瞬態對象是(應該是)持久。

這似乎是.merge()是調用正確的方法,但我們得到了一個N​​onUniqueObjectException,我們彷彿被稱爲.update()(這也不管用,不應該因爲持久實例目前是在會議) 。

我不知道爲什麼.merge()是給出了NonUniqueObjectException,因爲我的理解是.merge()是專門用於這種情況;試圖用臨時實例更新會話中存在的實體。 我的猜測是令人不安的是,持久實例與瞬態實例不同;我測試過了,當我在相同類的瞬態實例上調用.merge()時,所有內容都按預期工作。

不知道接下來要做什麼,我試着做.evict()的持久實例,然後.update()在瞬態的,但是這給了我一個StaleObjectException。在這一點上,我無法想出一個解決方案。我們是在試圖做一些愚蠢的事情,還是會出現某種配置問題?

回答

0

你不能在Java中做這個,也不能在休眠中做到這一點。它只能通過數據庫中的直接SQL查詢(繞過休眠)。您需要在休眠期間刪除B並創建一個新的C。您需要親自處理所有參考和關係(顯然存在於A)。 C#will also be assigned a new id (in case that A`有一個自動增量ID或者某物)。

+0

所以問題是改變子類呢?我有點失望,它不受支持。 –

+0

是的。無論如何,你怎麼能用Java來做到這一點?你不能。 – cherouvim