web-dev-qa-db-fra.com

CrudRepository et Hibernate: enregistrer (Liste <S>) vs enregistrer (Entité) dans la transaction

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?

20
BPm

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.

21
Ori Dar

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.

4
Kennico