我正在一個數據庫中存儲一個相對複雜的不可變對象。有許多多對一的關聯 - 對象具有屬性等屬性。使用Hibernate只保留表中不同的值
我想每個對象只存儲一次,基於一個商業密鑰,在這種情況下,對象的每個屬性。
工作流程是這樣的:
- 用戶創建一個複雜的對象。這可能需要很長時間,代碼都散佈在這個地方。
- 我查詢數據庫,看是否完全相同的對象已經存儲之前:
- 如果不是,
save
- 如果是,設置對象的ID和
merge
- 如果不是,
問題是Hibernate的merge
有很不方便的語義:
transientObject = createComplexTransientObject();
mergedObject = session.merge(transientObject);
// here you have to discard transientObject
// use mergedObject from now on
創建的對象必須丟棄,並用Hibernate提供的對象替換,這意味着我必須更新對它的所有引用。
我需要一種方法來告訴hibernate:「這個全新的transientObject看起來與已經在數據庫中的完全相同,將它合併到位。」換句話說:
object = createComplexTransientObject();
session.inPlaceMerge(object);
// object is now persistent
我該如何做到這一點?
是的,我知道通過示例查詢。我認爲QBE會根據我的查詢創建另一個對象,所以我有我的原始對象和查詢結果...我想單獨擁有原始對象。 – 2012-07-26 00:44:19
我必須調查saveOrUpdate。也許如果我的映射足夠聰明,可以將業務關鍵字聲明爲對象的所有字段,那麼當我運行一次保存時,它會得到一個id;我需要嘗試一下! – 2012-07-26 00:45:26