[英]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.