2017-08-02 70 views
0

我想知道在Spring項目中更新JPA實體的最佳做法是什麼 - 更新原始實體或創建新實體?我看到這兩種方法:如何在Spring JPA中實現實體?實現或創建新的?

  1. 使用原始 - 在原始實體中實現必要的字段並將此更新的實體保存回存儲庫。
  2. 使用副本 - 手動創建實體的新實例,將原始實體(+更新字段)中的所有字段設置爲新實體並將實體保存回存儲庫。

你推薦使用什麼方法?爲什麼?

回答

0

當涉及到更新,標準的方法是將檢索實體引用(閱讀下面),並進行交易方法中的變化:

private JpaRepository repo; 

@Transactional(readOnly = false) 
public void performChanges(Integer id){ 
    Entity e = repo.getOne(id); 

    // alter the entity object 
} 

關於例如幾件事情:

  • 您希望儘可能使用JpaRepositorygetOne方法,因爲它通常比CrudRepositoryfindOne更快。唯一的竅門是你必須確定該實體實際存在於具有給定ID的數據庫中。否則,你會得到一個例外。關於findOne方法不會發生這種情況,所以您需要對每個事務性方法作出決定,這會改變應用程序中的單個實體。
  • 您不需要觸發EntityManager上的任何persistsave方法,因爲更改將在提交事務時自動刷新..並且返回方法。

關於你的第二個選擇,我不認爲這是一個用途,因爲你需要使用上述方法獲取數據。如果您打算在事務處理之外使用該實體,那麼您可以再次使用從上述示例中檢索到的實體,然後在事務性上下文中再次執行merge,並因此繼續提供。

0

獲得一個實體,然後只是更新該實體是最簡單的方法。由於EntityManager管理一個實體並且知道被管實體已經存在於DB中(因此不需要執行額外的查詢),所以這比創建副本更快。

無論如何,有第三種和最快的方法:使用executeUpdateQuery對象。

entityManager 
    .createQuery("update EntityName set fieldName = :fieldName where id = :id") 
    .setParameter("fieldName", "test") 
    .setParameter("id", id) 
    .executeUpdate(); 

這是更快,因爲繞過持久性上下文

+0

你只需要確保在執行是它自己的事務中,或者它在事務性方法的第一次調用 –

相關問題