我想知道在Spring項目中更新JPA實體的最佳做法是什麼 - 更新原始實體或創建新實體?我看到這兩種方法:如何在Spring JPA中實現實體?實現或創建新的?
- 使用原始 - 在原始實體中實現必要的字段並將此更新的實體保存回存儲庫。
- 使用副本 - 手動創建實體的新實例,將原始實體(+更新字段)中的所有字段設置爲新實體並將實體保存回存儲庫。
你推薦使用什麼方法?爲什麼?
我想知道在Spring項目中更新JPA實體的最佳做法是什麼 - 更新原始實體或創建新實體?我看到這兩種方法:如何在Spring JPA中實現實體?實現或創建新的?
你推薦使用什麼方法?爲什麼?
當涉及到更新,標準的方法是將檢索實體引用(閱讀下面),並進行交易方法中的變化:
private JpaRepository repo;
@Transactional(readOnly = false)
public void performChanges(Integer id){
Entity e = repo.getOne(id);
// alter the entity object
}
關於例如幾件事情:
JpaRepository
的getOne
方法,因爲它通常比CrudRepository
的findOne
更快。唯一的竅門是你必須確定該實體實際存在於具有給定ID的數據庫中。否則,你會得到一個例外。關於findOne
方法不會發生這種情況,所以您需要對每個事務性方法作出決定,這會改變應用程序中的單個實體。EntityManager
上的任何persist
或save
方法,因爲更改將在提交事務時自動刷新..並且返回方法。關於你的第二個選擇,我不認爲這是一個用途,因爲你需要使用上述方法獲取數據。如果您打算在事務處理之外使用該實體,那麼您可以再次使用從上述示例中檢索到的實體,然後在事務性上下文中再次執行merge
,並因此繼續提供。
獲得一個實體,然後只是更新該實體是最簡單的方法。由於EntityManager
管理一個實體並且知道被管實體已經存在於DB中(因此不需要執行額外的查詢),所以這比創建副本更快。
無論如何,有第三種和最快的方法:使用executeUpdate
對Query
對象。
entityManager
.createQuery("update EntityName set fieldName = :fieldName where id = :id")
.setParameter("fieldName", "test")
.setParameter("id", id)
.executeUpdate();
這是更快,因爲繞過持久性上下文
你只需要確保在執行是它自己的事務中,或者它在事務性方法的第一次調用 –