簡體   English   中英

休眠-使用save()方法進行差異更新與使用update()方法進行差異更新

[英]Hibernate - difference update using save() method vs. update using update() method

我有一個簡單的Hibernate項目,其中使用save方法更新了一個現有Object。

因此以下代碼對我有用。

sessionObj.beginTransaction();
MyObject myObj = sessionObj.get(MyObject.class, objID);
myObj.setPropertyA("new value");
sessionObj.save(myObj);
sessionObj.getTransaction().commit(); 

我通過get()方法獲得ID為objID的Object,更改值,使用save()方法將其標記為持久並提交事務。 我觀察到Hibernate在這種情況下會生成UPDATE語句。

因此,如果我可以使用save()方法以這種方式進行UPDATE,則使用update()方法進行更新有何不同?

喜歡

MyObject myObj = sessionObj.get(MyObject.class, objID);
myObj.setPropertyA("new value");
sessionObj.update(myObj);

保存(方法)

save方法是一種不符合JPA規范的“原始”休眠方法。

它的目的與persist基本相同,但是實現細節不同。 該方法的文檔嚴格聲明其保留實例,“首先分配生成的標識符”。 保證該方法返回此標識符的Serializable值。

Person person = new Person();
person.setName("John");
Long id = (Long) session.save(person);

保存已經持久化的實例的效果與持久化的效果相同。 嘗試保存分離的實例時會有所不同:

Person person = new Person();
person.setName("John");
Long id1 = (Long) session.save(person);

session.evict(person);
Long id2 = (Long) session.save(person);

id2變量將不同於id1。 在分離的實例上調用save會創建一個新的持久性實例,並為其分配一個新的標識符,這將在提交或刷新后在數據庫中產生重復的記錄。

更新(方法)

與persist and save一樣,update方法是一種“原始” Hibernate方法,在添加merge方法之前很久就存在。 其語義在幾個關鍵點上有所不同:

它對傳遞的對象起作用(其返回類型為void); update方法將傳遞的對象從分離狀態轉換為持久狀態; 如果將瞬態實體傳遞給此方法,則此方法將引發異常。 在下面的示例中,我們保存對象,然后將其從上下文中逐出(分離),然后更改其名稱並調用update。 注意,我們沒有將更新操作的結果放在單獨的變量中,因為更新發生在person對象本身上。 基本上,我們是將現有的實體實例重新附加到持久性上下文上-JPA規范不允許我們這樣做。

Person person = new Person();
person.setName("John");
session.save(person);
session.evict(person);

person.setName("Mary");
session.update(person);

嘗試在瞬態實例上調用update將導致異常。 以下內容不起作用:

Person person = new Person();
person.setName("John");
session.update(person); // PersistenceException!

有關更多信息,請點擊此鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM