簡體   English   中英

休眠保持與保存

[英]Hibernate persist vs save

當我試圖了解Hibernate Save和堅持時,我遇到了這個解釋:

persist()定義明確。 它使瞬態實例持久化。 但是,它不能保證將標識符值立即分配給持久性實例,分配可能在刷新時發生。 規范沒有這么說,這是我的persist()問題。

persist()還保證如果在事務邊界之外調用它,則不會執行INSERT語句。 這在具有擴展會話/持久性上下文的長時間對話中很有用。

需要諸如persist()之類的方法。

save()不能保證相同,它返回一個標識符,並且如果必須執行INSERT來獲取標識符(例如,“ identity”生成器,而不是“ sequence”),則無論您是否在內部,該INSERT都會立即發生或交易之外。 在具有擴展的會話/持久性上下文的長時間對話中,這不好。

能否請您幫助我理解以下內容:

persist()還保證如果在事務邊界之外調用它,則不會執行INSERT語句。 這在具有擴展會話/持久性上下文的長時間對話中很有用。

這里的交易邊界是什么? 長期的對話是什么? 擴展會話/持久性上下文是什么意思?

也用於保存方法:

無論您是在事務內部還是外部,此INSERT都會立即發生。 在具有擴展的會話/持久性上下文的長時間對話中,這不好。

我了解,如果我們在程序中使用save方法來保存對象,則不需要像session.beginTransaction()和session.getTransaction()。commt()這樣的語句。 請讓我知道聲明是否在這里說同樣的話。 那么,這在長時間的對話中有什么用呢?

我剛冬眠,難以理解差異,請您幫我理解差異。

您的問題與Hibernate實現的View模式下的Open Session有關

這個想法是,您可能需要在整個特定過程中運行Web應用程序中的原子工作單元。 想象一下在線訂購食物。 您在一個頁面上登錄,在下一頁上選擇披薩和澆頭,在下一頁上添加甜點,在下一頁上添加飲料,並在最后一頁上付款。 您希望整個過程成為一個工作單元。

因此,Hibernate Session需要在該工作單元的開始處打開,然后在結束時關閉–可以手動或通過某種容器管理進行。

在該對話期間調用persist不會導致任何數據插入,但會使分離的實體持久。 Hibernate將“保留所有要插入的記錄”,然后在對話結束時將其刷新。

同時save立即執行插入操作,並從數據庫中為您的實體提供ID。 在長時間的對話中,這不好,因為您希望數據庫操作是原子的-全部或全部都不做。 可能會發生奇怪的事情,例如同一數據的多次插入。

希望能有所幫助。

save()方法可以返回由hibernate生成的主鍵id值,我們可以通過以下方式查看它:

long s = session.save(k);

在這種情況下, persist()永遠不會給客戶端任何價值,希望您一切都清楚。

因此, persist()方法可確保如果在事務邊界之外調用它,則不會執行INSERT語句,因為在持久化對象后無需獲取ID。

save()方法不能保證相同,因為它需要返回一個標識符(可能是主鍵ID)。

必須執行INSERT來獲取標識符(例如“身份”生成器),因此,無論您在事務內部還是外部,此INSERT都會通過save()立即發生。

保存和持久方法之間的主要區別之一取決於ID生成策略。 基本上,save()方法會將value(id)返回給客戶端,而persist()方法則不會。

1)在讓您的ORM引擎為您生成ID的情況下,您可以使用save()。原因很簡單:“休眠使您有機會了解它已生成/使用了什么ID來持久化對象”

2)如果您自己生成了自己的ID(分配的ID生成策略),並將其傳遞給ORM引擎以使用該ID來持久化您的對象,在這種情況下,persist()將是合適的。

點擊這里

就像我說的

“取決於ID生成策略”

干杯!

顧名思義,hibernate save()可用於將實體保存到數據庫。 我們可以在事務外部調用此方法。 如果我們在不使用事務的情況下使用此方法,並且在實體之間進行級聯,那么只有主實體才能保存,除非刷新會話

Hibernate持久性類似於保存(帶有事務),並且將實體對象添加到持久性上下文中,因此可以跟蹤任何進一步的更改。 如果在提交事務或刷新會話之前更改了對象屬性,則該對象屬性還將保存到數據庫中。 另外,我們只能在事務的邊界內使用persist()方法,因此它是安全的,並且可以處理所有級聯的對象。 最后,persist不返回任何內容,因此我們需要使用persisted對象來獲取生成的標識符值。

暫無
暫無

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

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