CrudRepository和Hibernate:在事务中保存(List <S>)vs save(Entity)

BPm*_*BPm 23 java spring hibernate jpa

如果我这样做会有什么不同:

@Transactional
public void processData() {
    List<MyEntity> entities = ....;
    MyEntityRepository.save(entities);
}
Run Code Online (Sandbox Code Playgroud)

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

底层查询和性能有什么区别?

Ori*_*Dar 23

来自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;
}
Run Code Online (Sandbox Code Playgroud)

因此,您的第二个业务方法只会影响save(Iterable<S> entities)Crud Repository方法,因为它会迭代列表并save(S)代表您进行调用.

只要事务processData业务方法划分开来,性能或执行的查询就没有真正的区别.


Ken*_*ico 7

正如Ori Dar所提到的,并没有什么区别。

但是,您应该注意一件事:用于保存元素列表的方法已根据回购历史记录<S extends T> List<S> saveAll(Iterable<S> entities)2.2.0.M1中重命名为,并且该方法不再将列表作为参数。save

由于我没有50个声誉来评论上面的答案或问题,因此我必须写一个有关此更改的新答案。


Ris*_*wal 6

repository.saveAll对于 SpringData Jpa,一种更简洁的方法是for使用repository.save. saveAll将自动遍历列表并保存它。

saveAll是JpaRepository的一部分,所以不需要定义任何方法。