我想知道我最近遇到的一个案子。假设我们有一个服务方法如下:
@Override
public User addUser(UUID organizationId, User user) {
Organization organization = organizationRepository.findById(organizationId).orElseThrow(IllegalArgumentException::new);
user.setOrganization(organization);
organization.getUsers().add(user);
invitationService.deleteByUserEmail(user.getEmail());
return user;
}
组织由存储库方法提供:
@Repository
public interface OrganizationRepository extends JpaRepository<Organization, UUID> {
Optional<Organization> findById(UUID id);
}
添加用户只会因为invitationService.deleteByUserEmail(user.getEmail());
存在而起作用。整个方法属于另一个服务,如下所示:
@Override
@Transactional
public void deleteByUserEmail(String userEmail) {
invitationRepository.deleteByUserEmail(userEmail);
}
我不确定我是否正确理解添加用户的原因。根据Hibernate Docs,仅当实体处于托管状态且更新发生在单个事务中时,才会发生自动更新。如果我的推理是正确的,则会发生以下步骤:
尽管 addUser 方法非交易,是否有可能?
答案 0 :(得分:0)
在您的其中一个配置类中,您可能会注册特殊过滤器,这些过滤器基本上保持会话/实体管理器在整个请求的生命周期内打开:
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
或
org.springframework.orm.hibernate5.support.OpenSessionInViewFilter