2011-03-15 66 views
3

我正在研究spring-hibernate-envers應用程序。很多谷歌搜索的東西終於爲我工作,但我仍然有幾個問題。hibernate envers:merge&saveOrUpdate

  1. 早些時候,我使用saveOrUpdate爲 保存或更新實體。但 在與envers工作時是 拋出nonUniqueObject 異常。所以我用merge而不是 它工作。爲此使用 合併是否正確? merge是否將 新對象插入到db?

  2. 我嘗試下面的代碼:

entity=merge(entity); 
saveOrUpdate(entity); 

這也工作過。這是正確的方式嗎?而且我很好奇,爲什麼saveOrUpdate現在沒有拋出任何錯誤。

回答

10

Hibernate Reference說:

saveOrUpdate()方法執行以下操作:

  • 如果對象是在這個會議上已經執着,什麼也不做
  • 如果與另外一個對象會話具有相同的標識符,拋出異常
  • 如果對象沒有標識符屬性,則save()它
  • 如果對象的標識符具有賦值給新實例化對象的值,則save()它
  • 如果對象被版本化爲or或版本屬性值是分配給新創建的對象相同的值,保存()它
  • 否則update()這個對象

和合並()有很大不同:

  • 如果有持續性實例與當前與會話關聯的標識符相同,將給定對象的狀態複製到持久實例上
  • 如果當前沒有與會話關聯的持久實例,請嘗試從數據庫加載它或創建新的持久實例
  • 持久實例返回
  • 給定的對象沒有被關聯到session上,它仍然超脫

這意味着你可以使用saveOrUpdate()如果您確信具有相同標識符的對象是沒有關聯會議。否則,你應該使用merge()

下面的代碼

entity=merge(entity); 
saveOrUpdate(entity); 

作品,因爲merge()結果是一個持久化對象,因此它是由saveOrUpdate()忽略,所以第二行沒有任何意義。

+0

好吧,所以如果我不確定具有相同ID的對象可能與會話相關聯,我應該與合併。正如你已經提到的合併也插入新的對象到數據庫,應該沒有問題。合併還需要更多資源,然後saveOrUpdate?感謝您的回答。 – parbi 2011-03-15 13:12:32

+1

@parbi:與'saveOrUpdate'相比,'merge'會生成一個額外的SQL查詢,因爲'saveUpdate'使用標識符來確定是否應該保存對象,而merge將對數據庫進行檢查。 – axtavt 2011-03-15 13:30:08

+0

您確定這條語句:merge()的結果是一個持久對象,因此它被saveOrUpdate()忽略,所以第二行沒有任何意義。正如你的回答所述,合併後對象仍然被分離 – fabien7474 2011-09-22 06:54:55

0

saveOrUpdate:如果請求的對象是transient(空主鍵值),那麼將其保存在數據庫中或更新它。條件是會話中只有該實體的一個副本。

合併: Hibernate將首先檢查持久性 上下文中是否存在該類型的持久實例。它使用對象標識符來檢查這個存在。如果存在另一個實例,它將Detached對象的狀態 複製到現有的Persistence對象中。如果不存在其他實例,則Hibernate僅重新掛接Detached對象。

如果會話包含單個實體的多個副本,則使用最新實體更新所有副本。 在您致電更新之前,它不會在數據庫中更新。

+0

因此,我需要每次使用saveOrUpdate後合併?感謝你的回答。 – parbi 2011-03-15 13:13:57

+1

是的。由於給定實例未與會話關聯,因此它仍保持分離狀態。 – nIKUNJ 2011-03-15 13:22:00

相關問題