@Transactional
在使用两个不同的repositories.save()
时无法正确回滚。 repository1.save()
之一通过相同的事务方法持久化数据,其中repository2.save()
由于约束异常而失败。仍然第一个存储库记录仍保留在db中。
我尝试将@EnableTransaction
管理添加到@SpringBootApplication
,还尝试回滚@Transactional
的属性,但是没有运气。
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private UserProfileRepository userProfileRepository;
@Override
public User findUserByUsername(String username) {
return userRepository.findByUsername(username);
}
@Override
@Transactional()
public User save(UserTO userTO) {
User user = User.builder().username(userTO.getUsername()).
password(userTO.getPassword()).build();
user = userRepository.save(user);
UserProfile userProfile = UserProfile.builder().firstName(userTO.getFirstName()).
lastName(userTO.getLastName()).
dateOfBirth(AppUtil.parseDateString(userTO.getDateOfBirth())).
gender(Gender.valueOf(userTO.getGender())).build();
userProfileRepository.save(userProfile);
return user;
}
}
不应将用户保存为userprofilerepositoy.save(
)引发验证失败异常。
异常跟踪如下:
例外是 org.springframework.transaction.TransactionSystemException:无法 进行JPA交易;嵌套异常为 javax.persistence.RollbackException:提交错误 交易]与根本原因 javax.validation.ConstraintViolationException:在持续时间内,对类[com.flash.socio.domain.UserProfile]的验证失败 对于组[javax.validation.groups.Default,]约束列表 违反:[ ConstraintViolationImpl {interpolatedMessage ='一定不能为null',propertyPath = user,rootBeanClass = class com.flash.socio.domain.UserProfile, messageTemplate ='{javax.validation.constraints.NotNull.message}'}