2013-11-28 94 views
0

假設我有一個名爲Player的類,它持久化爲hibernate,並且具有生成的ID和複合自然ID。玩家是一個複雜的類,它存儲了也產生了ID的其他對象的層次結構。休眠保存或更新沒有主鍵的對象

我可以查詢json的web服務來獲取Player的實例。 json被Jackson解析,構建一個完整的Player對象,除了它不會生成任何生成的Ids。我基本上想要在這個播放器的實例上執行saveOrUpdate。

一個選項是通過自然ID查詢Player對象的數據庫。如果沒有對象返回,請進行保存。否則,手動將Player對象(及其所有字段)的所有值從Web服務中複製到數據庫中的對象,然後執行更新。我不喜歡這個選項,因爲它看起來效率低下,並且會包含很多額外的代碼。

我更願意做的就是將生成的Ids從數據庫對象複製到Web服務中的對象,然後對其進行更新。不幸的是,我一直無法完成這項工作。我想用合併()會做的伎倆,但我得到這個異常:

org.hibernate.HibernateException:多行與指定的標識符發現

什麼是處理這種情況的最好方法是什麼?

+0

嘗試'了Session.update(OBJE)'insted的合併() – jos

回答

0

我可以問你爲什麼不讓傑克遜把生成的ID(我認爲是PK)傳遞給客戶端?如果你這樣做了,你可以保存或更新來保存Player對象。

我通過確保Jackson幾乎只使用PK(實際上是PK和名稱,因此可以創建鏈接)來處理與其他對象(不應該由相同方法處理的實體和集合)的關係,序列化,使用@JsonSerialize。

即使我的實體引用其他實體/集合,我可以簡單地使用沒有DTO,轉換或額外的數據庫訪問的CRUD操作。

BR, 延

+0

的我真的不知道你的意思是讓傑克遜通過生成的ID。我無法控制Web服務。它向我發送了一個多級別的哈希表,並且將一個生成的Id添加到根對象中,否則明智的是我必須使用組合鍵。出於同樣的原因,我還爲對象中的所有列表/地圖添加了一個Id。 – Sarevok