2013-07-13 12 views
8

Jestem nowy w Spring MVC i nie bardzo pomysł z JPA, jak również. wszystko, co chcę zrobić, to zaktualizować listę rekordów i działa dobrze, gdy przeglądam listę i aktualizuję wywołania na DAO.JPA Hibernate luzem/partii aktualizacji wiosną MVC

Ale nie chcę wykonywać 100 operacji aktualizacji/wstawiania lub przejazdów w obie strony DB.

Czy ktoś proszę mi pokazać, jak zaktualizować około 100 rekordów z aktualizacją wsadowego zamiast w następujący sposób:

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

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

Czy to możliwe, jeśli ktoś może podać mi w prosty sposób wykonać aktualizację partii. Byłbym bardzo wdzięczny, gdybym otrzymał jak najwięcej wyjaśnień, jak to możliwe.

Dzięki

Odpowiedz

5

co masz jest dość dużo standardowy sposób aktualizowania wielu wierszy przez WZP. zdarzenie spring-data-jpa, które ujawnia save(Iterable<T> items) po prostu pętle nad Iterator pod okładkami. here - inne pytanie, na które bardzo dobrze odpowiedziano na temat opcji, ale w skrócie, jesteś na dobrej drodze, alternatywa polega na samodzielnym formułowaniu i wykonywaniu aktualizacji.

aktualizacja: wykonywanie w pojedynczej transakcji może zwiększyć wydajność, ponieważ tylko jednorazowe obciążenie transakcji. otrzymasz także scenariusz, w którym, jeśli jedna z aktualizacji nie powiedzie się, wszystkie poprzednie również zostaną wycofane. (więc potencjalnie tracisz całą "pracę" z poprzednich aktualizacji - możesz lub nie chcesz tego)

również, być świadomym rodzaju menedżera transakcji, którego używasz (np. JTA lub JPA) i implementacji JPA (np. Hibernacja) jako czasami nie grają razem.

tak, w swoim kodzie DAO możesz to zrobić;

  • dodać przeciążenia kod
  • update(Iterator<Entity> entities) w tym kodzie zrobić coś jak następuje;

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

    for (Entity entity : entities) {

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

    }

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

  • lub można użyć @Transactional adnotacji na metodzie save(Iterable<Entity> entities). upewnij się, że masz obsługę adnotacji transakcyjnych w Spring Context też
+0

Co zrobić, jeśli zrobię pętlę w transakcji i zatwierdzeniu połączenia końcowego. jaka by to różnica. Czy możesz po prostu wyjaśnić, – user22197

+0

jest to dobry pomysł, aby użyć partii wiosny do tego lub wyjść z proc? – user22197

+0

, aby odpowiedzieć na część wiosenno-wsadową, czy musisz wykonać synchroniczną odpowiedź dla osoby dzwoniącej? –

Powiązane problemy