2015-09-26 9 views
13

farebbe alcuna differenza se faccio:CrudRepository e Hibernate: salvare (Lista <S>) vs salvare (Entity) in un'operazione

@Transactional 
public void processData() { 
    List<MyEntity> entities = ....; 
    MyEntityRepository.save(entities); 
} 

vs.

@Transactional 
public void processData() { 
    List<MyEntity> entities = ....; 
    for (MyEntity entity : entities) { 
     MyEntityRepository.save(entity); 
    } 
} 

Qual è la differenza in termini delle query e delle prestazioni sottostanti?

risposta

10

Da SimpleJpaRepository:

@Transactional 
public <S extends T> List<S> More save(Iterable<S> entities) { 

    List<S> result = new ArrayList<S>(); 

    if (entities == null) { 
     return result; 
    } 

    for (S entity : entities) { 
     result.add(save(entity)); 
    } 

    return result; 
} 

Così, il metodo secondo di affari di shadows solo save(Iterable<S> entities) metodo Crud Repository, nel senso che itera la lista e invita save(S) a vostro nome.

Finché la transazione è delimitata dal tuo metodo commerciale processData, non c'è davvero alcuna differenza nelle prestazioni o nelle query eseguite.

+0

Se il mio elenco contiene più Entità con la stessa chiave primaria e quindi chiamo 'save (Lista entità)', fornisce un'eccezione di vincolo. Tuttavia, se itoate (cioè il secondo metodo di business), non si lamenta. Perché? – BPm

+0

Interessante. La mia ipotesi è che in qualche modo '@ Transactional' non si applica per' processData() ', quindi nella seconda variante ogni iterazione viene eseguita all'interno del proprio contesto transazionale, quindi ha successo. –

Problemi correlati