java - CrudRepository.save(Iterable<S>) 是原子的吗?

标签 java spring hibernate spring-data-jpa spring-data

我正在使用 CrudRepository.save(Iterable<S>) 保存多个对象.

这个操作行为是原子的吗?

如果我保存了 10 个实体,而第 6 个实体失败了,会发生什么情况?

最佳答案

在所看到的背后,这是 SimpleJpaRepository 使用 Iterable 保存方法时发生的情况

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

值得注意的是,在最新版本中,使用Iterable保存已更改为saveAll Refer changes了解更多详情

What will happen if I save 10 entities and it fails for 6th one?

默认情况下CrudRespository将具有@Transactional,因此在发生异常的情况下不会保存任何内容。

如果手动处理,这将起作用

如果你正在做这样的事情,事情将会回滚。

@Transactional(rollbackFor=RuntimeException.class)
public List<Car> saveAllOrNone(List<Car> cars) {
    for(Car car: cars) {
        repo.save(car);
    }
}

关于java - CrudRepository.save(Iterable<S>) 是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56324363/

相关文章:

java - 向 heroku play framework 2.2.1 java app 添加新的遗物插件

java - 如何从 Quartz 作业内部执行 Struts 2 Action。如何获取容器?

java - Hibernate与JPA注释问题-惰性对象

java web应用布局,请解释一些设计原则/模式

java - Hibernate GUID 本地生成器

java - 刽子手循环问题

java 从字符串中加载类

spring - 使用 Config Server 清洁部署 Spring Boot 微服务

java - 同一个 JPA 类的多个数据库支持

java - 如何在具有多个 servlet 的 tomcat 中使用 DispatcherServlet