CrudRepository和Hibernate:在事务

时间:2015-09-26 03:44:23

标签: java spring hibernate jpa

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

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

底层查询和性能有何不同?

3 个答案:

答案 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个声誉来评论以上答案或问题,因此我必须针对此更改写一个新答案。