簡體   English   中英

EntityManager.flush 有什么作用,為什么我需要使用它?

[英]What does EntityManager.flush do and why do I need to use it?

我有一個 EJB,我將一個對象保存到數據庫中。 在我看到的一個例子中,一旦保存了這些數據(EntityManager.persist),就會調用 EntityManager.flush(); 為什么我需要這樣做? 我正在保存的對象未附加且稍后在方法中未使用。 事實上,一旦保存方法返回,我希望資源被釋放。 (示例代碼也在 remove 調用中執行此操作。)

if (somecondition) {
    entityManager.persist(unAttachedEntity);
} else {
    attachedEntityObject.setId(unAttachedEntity.getId());
}
entityManager.flush();

調用EntityManager.flush(); 將強制數據立即保留在數據庫中,因為EntityManager.persist()不會(取決於 EntityManager 的配置方式: FlushModeType (AUTO 或 COMMIT)默認設置為 AUTO,如果它是設置為 COMMIT 當事務提交時,數據到底層數據庫的持久性將被延遲)。

EntityManager.persist()使實體持久化,而EntityManager.flush()實際上在您的數據庫上運行查詢。

因此,當您調用EntityManager.flush() ,會在數據庫中執行插入/更新/刪除關聯實體的查詢。 此時將知道任何約束失敗(列寬、數據類型、外鍵)。

具體行為取決於刷新模式是 AUTO 還是 COMMIT。

EntityManager.flush()操作可用於在提交事務之前將所有更改寫入數據庫。 默認情況下,在提交事務之前,JPA 通常不會將更改寫入數據庫。 這通常是可取的,因為它避免了數據庫訪問、資源和鎖定,直到需要為止。 它還允許對數據庫寫入進行排序和批處理以實現最佳數據庫訪問,並保持完整性約束並避免死鎖。 這意味着當您調用持久、合並或刪除數據庫 DML INSERTUPDATEDELETE ,不會執行,直到提交,或直到觸發刷新。

因此,當您調用EntityManager.persist() ,它只會使實體由EntityManager管理並將其(實體實例)添加到Persistence Context Explicit flush()將使現在駐留在Persistence Context的實體移動到數據庫中(使用 SQL)。

如果沒有flush(),當這個Persistence Context關聯的事務被提交時,這個(將實體從Persistence Context移動到數據庫)將會發生。

EntityManager.flush()將實際的 SQL 命令發送到 DB。

持久性框架通常在幕后管理事務。 因此無法保證刷新的查詢會成功提交

EntityManager.flush()總是在事務提交之前由持久性框架在幕后自動調用。

EntityManager.persist()僅將實體注冊到持久化上下文,而不會向 DB 發送任何 SQL 語句。 這意味着在persist()之后您不會獲得自動生成的 ID。 您只需傳遞持久化對象,最終在flush()它會獲得ID。 您可以自己調用flush()以更早獲取這些 ID 但同樣,它不是事務的結束,因此可以回滾甚至更多:其他事務/線程/進程/服務器可能會看到更改(通過幻讀),然后根據數據庫引擎和當前和外貿!

暫無
暫無

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

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