如果我这样做会有什么不同:
@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);
}
}
底层查询和性能有何不同?
答案 0 :(得分:15)
来自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;
}
因此,您的第二个业务方法只会影响save(Iterable<S> entities)
Crud Repository方法,因为它会迭代列表并代表您调用save(S)
。
只要从您的processData
业务方法划分事务,就无法在性能或执行的查询方面产生任何差异。
答案 1 :(得分:2)
对于SpringData Jpa,更干净的方法是使用repository.saveAll
而不是for
的{{1}}循环。 repository.save
将自动遍历列表并保存。
saveAll
是JpaRepository的一部分,因此无需定义任何方法。
答案 2 :(得分:1)
正如Ori Dar所提到的,并没有什么不同。
但是,您应该注意一件事:用于保存元素列表的方法已根据2.2.0.M1重命名为repo history中的<S extends T> List<S> saveAll(Iterable<S> entities)
,并且{ {1}}方法不再将列表作为参数。
由于我没有50个声誉来评论以上答案或问题,因此我必须针对此更改写一个新答案。