Cela ferait-il une différence si je le fais:
@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);
}
}
Quelle est la différence en termes de requêtes sous-jacentes et de performances?
De 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;
}
Ainsi, votre deuxième méthode métier ne fait que masquer la méthode save(Iterable<S> entities)
Crud Repository, en ce sens qu'elle itère la liste et appelle save(S)
en votre nom.
Tant que la transaction est démarquée de votre méthode métier processData
, il n'y a pas vraiment de différence de performances ou de requêtes exécutées.
Comme ce qui a été mentionné par Ori Dar , il n'y a pas vraiment de différence.
Cependant, il y a une chose que vous devriez remarquer: la méthode utilisée pour enregistrer une liste d'éléments a été renommée en <S extends T> List<S> saveAll(Iterable<S> entities)
en 2.2.0.M1 selon le historique des repo , et la méthode save
ne prend plus comme argument une liste.
Comme je n'ai pas 50 points de réputation pour commenter la réponse ou la question ci-dessus, je dois écrire une nouvelle réponse à propos de ce changement.