为什么在 Spring 数据中需要 save()?
Why save() is necessary in Spring Data?
在 Spring Data JPA 文档中,在 Transactionality 部分下有一个关于使用 facade 为多个存储库调用定义事务的示例:
@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 数据.
我明白,由于交易的缘故,即使没有 save()
调用,交易结束时的所有内容都会持久保存到数据库中。但我不明白为什么 它应该仍然存在 以及 与 Spring Data[=27] 提供的存储库抽象保持一致是什么意思=].
我认为 .save()
是多余的调用。
我想说你引用的这篇文章只是一个很好的做法 - 它增强了代码的可读性/可维护性,即请记住,如果你在 @Transactional
方法中分离一个实体,这个实体将不会被坚持。并且明确声明实体的持久性对于开发人员来说几乎是不言自明的(或者在提到的分离的情况下导致异常,这也是不言自明的)。
我会说你所问的这种一致性就是这个意思,至少对我来说是这样。保持一致意味着显式实现无论如何都会被调用的方法(“幕后”,这通常会导致错误)。
在 Spring Data JPA 文档中,在 Transactionality 部分下有一个关于使用 facade 为多个存储库调用定义事务的示例:
@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 数据.
我明白,由于交易的缘故,即使没有 save()
调用,交易结束时的所有内容都会持久保存到数据库中。但我不明白为什么 它应该仍然存在 以及 与 Spring Data[=27] 提供的存储库抽象保持一致是什么意思=].
我认为 .save()
是多余的调用。
我想说你引用的这篇文章只是一个很好的做法 - 它增强了代码的可读性/可维护性,即请记住,如果你在 @Transactional
方法中分离一个实体,这个实体将不会被坚持。并且明确声明实体的持久性对于开发人员来说几乎是不言自明的(或者在提到的分离的情况下导致异常,这也是不言自明的)。
我会说你所问的这种一致性就是这个意思,至少对我来说是这样。保持一致意味着显式实现无论如何都会被调用的方法(“幕后”,这通常会导致错误)。