2010-08-06 17 views
1

我正在一個數據庫中存儲一個相對複雜的不可變對象。有許多多對一的關聯 - 對象具有屬性等屬性。使用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 

我該如何做到這一點?

回答

0

我相信saveOrUpdate的確如你所願。但其行爲還取決於您的映射。

如果你要saveOrUpdate,它會給你你期望的結果嗎?


這裏有點偏題:你知道關於Query By Example? http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-examples


沒關係。我只是看到這個問題已經兩歲了。愚蠢的「相關問題」 - stackoverflow的選項。

+0

是的,我知道通過示例查詢。我認爲QBE會根據我的查詢創建另一個對象,所以我有我的原始對象和查詢結果...我想單獨擁有原始對象。 – 2012-07-26 00:44:19

+0

我必須調查saveOrUpdate。也許如果我的映射足夠聰明,可以將業務關鍵字聲明爲對象的所有字段,那麼當我運行一次保存時,它會得到一個id;我需要嘗試一下! – 2012-07-26 00:45:26