理解JPA 和Hibernate 中persist() 和merge() 之間的區別
在物件關係映射領域,JPA ( Java Persistence API)及其實作Hibernate 提供了管理資料庫中實體的關鍵方法。 persist() 和 merge() 這兩個重要方法在處理實體持久化和更新方面發揮著不同的作用。
persist() 的功能
persist() 運行於透過以下方式:
- 對於新實體,它啟動持久化過程,使其成為託管實體。它會產生一個 INSERT 查詢以將實體新增至資料庫。
- 如果實體已作為託管實體存在,persist() 會忽略它,但會使用cascade=PERSIST 或cascade=ALL 註釋將操作級聯到引用的實體.
- 它將刪除的實體重新插入資料庫。
merge() 的機制
merge() 有不同的方法:
- 合併分離的實體時,它會建立該實體的新託管副本或更新具有相同識別的現有託管實例。
- 對於新實體, merge( ) 建立一個新的託管實例並將其狀態複製到其中。
- 如果實體被標記為已刪除,則 merge() 會拋出例外。
- 它會忽略託管實體,但會將操作級聯到引用帶有cascade=MERGE 或cascade=ALL 註釋的實體。
- 合併遞歸地啟動被修改實體所引用的實體的級聯操作。
詳細的JPA 規範
JPA 規範清楚地概述了這些操作的語義:
對於persist()
-
新實體: 在交易提交或刷新期間將實體輸入資料庫。
-
現有託管實體: 忽略,但級聯到使用cascade=PERSIST 或cascade=ALL 註解的參考實體。
-
已刪除的實體: 成為託管物件。
-
分離的物件: 可能在呼叫期間或稍後刷新/提交時拋出 EntityExistsException。
對於merge()
-
分離的實體: 將其狀態複製到預先存在的或新建立的託管實體執行個體。
-
新實體: 使用複製的狀態建立新的託管實體執行個體。
-
已刪除實體: 引發 IllegalArgumentException。
-
託管實體: 被忽略,但級聯操作到使用cascade=MERGE 或cascade=ALL 註解的參考實體。
理解 persist() 和 merge() 之間的細微差別對於有效的實體管理和資料操作至關重要在 JPA 和 Hibernate 應用程式中。
以上是## 在 JPA 和 Hibernate 中何時使用 `persist()` 與 `merge()`:實體持久化和更新指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!