2013-07-13 13 views
8

Sono nuovo a Spring MVC e non ho molta idea con JPA. tutto quello che voglio fare è aggiornare un elenco di record e il suo funzionamento funziona quando faccio un giro dell'elenco e chiedo l'aggiornamento su DAO.JPA Aggiornamento di massa/batch in primavera MVC

Ma non desidero eseguire 100 operazioni di aggiornamento/inserimento o viaggi di andata e ritorno DB.

qualcuno potrebbe per favore mi mostrano come aggiornare circa 100 record con aggiornamento batch invece di fare quanto segue:

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

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

E 'possibile, se qualcuno mi potrebbe fornire un modo semplice per eseguire l'aggiornamento batch. Mi piacerebbe davvero ricevere più spiegazioni possibili.

Grazie

risposta

5

quello che hai è più o meno il modo standard di aggiornare più righe tramite JPA. l'eventoche espone lo save(Iterable<T> items) scorre appena sopra lo Iterator sotto le coperte. here Un'altra domanda a cui si risponde molto bene sulle opzioni, ma in breve, sei sulla strada giusta con l'alternativa di formulare ed eseguire tu stesso la dichiarazione di aggiornamento.

aggiornamento: l'esecuzione in una singola transazione può aumentare le prestazioni poiché si dispone solo del sovraccarico della transazione una volta. si ottiene anche lo scenario in cui, se uno degli aggiornamenti fallisce, anche i precedenti vengono ripristinati. (quindi, potresti perdere tutto il "lavoro" dagli aggiornamenti precedenti - potresti o meno volerlo)

Inoltre, tieni presente il tipo di gestore transazioni che stai utilizzando (ad esempio JTA o JPA) e l'implementazione JPA (es. Hibernate) come a volte non giocano bene insieme.

quindi, nel codice DAO si consiglia di farlo;

  • aggiungere un codice update(Iterator<Entity> entities) sovraccarico
  • al codice di fare qualcosa di simile al seguente;

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

    for (Entity entity : entities) {

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

    }

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

  • oppure si può utilizzare il @Transactional annotazioni sul vostro metodo di save(Iterable<Entity> entities). assicurati di avere il supporto annotazione transazionale anche nel contesto di primavera
+0

Cosa succede se eseguo il ciclo in una transazione e nel commit di fine chiamata. che differenza avrebbe fatto puoi per favore solo spiegare – user22197

+0

è una buona idea usare il batch di primavera per questo o uscire da proc ??? – user22197

+0

per rispondere alla parte Spring Batch, è necessario eseguire una risposta sincrona al chiamante? –

Problemi correlati