web-dev-qa-db-ja.com

CrudRepositoryおよびHibernate:トランザクションのsave(List <S>)vs save(Entity)

私がやった場合、それは何か違いがありますか?

@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);
    }
}

基になるクエリとパフォーマンスの点で違いは何ですか?

20
BPm

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;
}
_

したがって、2番目のビジネスメソッドは、リストを反復処理し、ユーザーに代わってsave(Iterable<S> entities)を呼び出すという意味で、save(S) Crud Repositoryメソッドのみをシャドウします。

processDataビジネスメソッドからトランザクションが区切られるである限り、パフォーマンスや実行されるクエリに実際の違いはありません。

21
Ori Dar

Ori Dar が言及したように、実際に違いはありません。

ただし、注意すべき点が1つあります。要素のリストを保存するために使用されるメソッドは、 2.2.0.M1<S extends T> List<S> saveAll(Iterable<S> entities)に名前が変更されました。 repo history 、およびsaveメソッドは引数としてリストを取りません。

上記の回答や質問にコメントする評判が50もないため、この変更に関する新しい回答を作成する必要があります。

4
Kennico