【问题标题】:Save(List<S>) vs save(Entity) in transaction part two事务第二部分中的 Save(List<S>) vs save(Entity)
【发布时间】:2019-07-20 03:13:27
【问题描述】:

问题来自CrudRepository and Hibernate: save(List<S>) vs save(Entity) in transaction

如果我没有在下面用@Transactional 标记以下内容。如果数据库连接断开或在 Spring Data JPA 保存列表时发生某些事情。列表会被回滚还是只是部分保存?

@Transactional
public void processData() {
   List<MyEntity> entities = ....;
   MyEntityRepository.save(entities);
}

【问题讨论】:

  • 这个方法是事务的一部分吗?如果是,那么它将被回滚。

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


【解决方案1】:

这在很大程度上取决于MyEntityRepository 的实现。

例如如果它是由 spring 作为 SimpleJpaRepository 生成的,那么它将被回滚。因为如链接问题所示,save() 方法也用@Transactional 注释:

@Transactional
public <S extends T> List<S> save(Iterable<S> entities) {}

但是对于其他所有实现?我会说行为是未定义的

【讨论】:

    【解决方案2】:

    CrudRepository 提供的方法已经是事务性的。

    这个根本不需要,看看this的实现就行了。所有方法delete,deleteAll,saveAllare annotated with@Transactional`。这意味着,默认实现已经将其考虑在内。

    其实凡是没有@Transactional注解的地方,都会使用默认的@Transactional(readOnly = true),也就是类级别的。

    【讨论】:

      猜你喜欢
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 2011-03-24
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多