【问题标题】:Why save() is necessary in Spring Data?为什么在 Spring Data 中需要 save()?
【发布时间】:2021-01-24 14:23:19
【问题描述】:

在 Spring Data JPA 文档中,Transactionality 部分下有一个关于使用外观来定义多个存储库调用的事务的示例:

@Service
class UserManagementImpl implements UserManagement {

  private final UserRepository userRepository;
  private final RoleRepository roleRepository;

  @Autowired
  public UserManagementImpl(UserRepository userRepository, RoleRepository roleRepository) {
    this.userRepository = userRepository;
    this.roleRepository = roleRepository;
  }

  @Transactional
  public void addRoleToAllUsers(String roleName) {
    Role role = roleRepository.findByName(roleName);

    for (User user : userRepository.findAll()) {
      user.addRole(role);
      userRepository.save(user);
    }
  }
}

还有一点需要注意的是,从 JPA 的角度来看,对 save 的调用并不是绝对必要的,但为了与 Spring Data 提供的存储库抽象保持一致,应该仍然存在.

我了解由于事务的原因,即使没有save() 调用,它最后的所有内容都将保存到数据库中。但我不明白为什么它应该仍然存在以及与 Spring Data 提供的存储库抽象保持一致意味着什么

我认为.save() 是一个多余的调用。

【问题讨论】:

  • 这里的冗余是什么意思?
  • @k-wasilewski 即使没有save() 调用,用户也会被持久化到数据库中。

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


【解决方案1】:

我想说你引用的这段文字只是一个很好的做法 - 它增强了代码的可读性/可维护性,即请记住,如果你在 @Transactional 方法中分离实体,这个实体将不会被持久化。并且明确说明实体的持久性对于开发人员来说几乎是不言自明的(或者在提到分离的情况下会导致异常,这也是不言自明的)。

我想说的是,您所询问的这种一致性就是这个意思,至少对我来说是这样。一致意味着显式实现无论如何都会被调用的方法(“在幕后”,这通常会导致错误)。

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 2013-08-14
    • 2023-01-30
    • 2016-02-15
    • 2021-06-08
    相关资源
    最近更新 更多