2013-07-13 179 views
8

我是Spring MVC的新手,對JPA也不太瞭解。我所要做的就是更新一個記錄列表,並且在我循環訪問DAO列表並調用更新時,它的工作狀況良好。JPA Hibernate批量/批量更新Spring MVC

但我不想執行100次更新/插入操作或數據庫往返。

可以在任何一個,請告訴我如何更新而不是做以下大約100條記錄與批量更新:

Controller: 
    List<MyEntity> list = form.getList(); 
    for(MyEntity e : list){ 
     dao.update(e); 
    } 

Dao: 
    public T update(T entity){ 
     entityManager.merge(entity);   
    } 

是否有可能,如果有人能提供給我進行批量更新的簡單方法。如果我儘可能多地解釋,我會非常感激。

謝謝

回答

5

你得到的東西幾乎是通過JPA更新多行的標準方式。公開save(Iterable<T> items)的事件spring-data-jpa只是覆蓋Iteratorhere的另一個問題在選項上得到了很好的回答,但總而言之,您正處於正確的道路上,替代方案是自己制定並執行更新語句。

更新: 在單個事務中執行可能會提高性能,因爲您只有一次事務開銷。如果其中一個更新失敗,那麼以前的任何更新都會回滾。 (所以,可能你失去了以前更新的所有'工作' - 你可能會也可能不想這樣做)

另外,請注意您正在使用的事務管理器類型(例如JTA或JPA)和JPA實現(如休眠)有時他們一起玩不好。

所以,在你的DAO代碼中你可能想要這樣做;

  • 添加過載update(Iterator<Entity> entities)
  • 在代碼執行類似以下;

    entityManager.getTransaction().begin();//start the transaction

    for (Entity entity : entities) {

    entityManager.merge(entity);//update an entity 
    

    }

    entityManager.getTransaction().commit();//complete the transaction

  • 或者您可以使用@Transactional註釋您save(Iterable<Entity> entities)方法。確保您在Spring上下文中也有事務註釋支持
+0

如果我在事務和最終調用提交中執行循環,該怎麼辦?它會有什麼不同。你可以請你解釋一下 – user22197

+0

這是一個好主意,爲此使用彈簧批或走出pro? – user22197

+0

回答Spring-Batch部分,你是否需要對調用者做同步響應? –