spring-boot - spring boot 2 + spring data jpa回滚事务
问题描述
我有一个带有 spring data jpa 的 spring boot 2 项目用于持久性。我有一个管理器,它的内部调用了 3 种不同的保存方法。每个保存都位于在类级别注释为事务的服务中。经理的方法也被注释为事务性的。数据库是 PastgeSQL
经理的方法是
@Override
@Transactional
public void saveUserComplete(CustomUserDetail user, UserAnag anag, List<UserRolePermission> rolePermissions) {
this.userDetailsService.save(user);
this.userAnagService.save(anag);
this.userRolePermissionService.saveAll(rolePermissions);
}
而里面调用的3个服务方法是
public void save(CustomUserDetail user) {
Calendar c = Calendar.getInstance();
Date now = c.getTime();
UserEntity entity = null;
if(null != user.getId()){
Optional<UserEntity> entityOpt = this.userRepository.findById(user.getId());
if(entityOpt.isPresent()){
entity = entityOpt.get();
entity.setUpdatedAt(now);
//entity.setUpdateUser();
}
}
else{
entity = new UserEntity();
entity.setCreatedAt(now);
//entity.setCreatUser();
}
entity.fillEntityFromPojo(user);
if(null != entity) { this.userRepository.save(entity); }
}
第一个网络称为
public void save(UserAnag userAnag){
Calendar c = Calendar.getInstance();
Date now = c.getTime();
UserAnagEntity entity = null;
if (null != userAnag.getUsername()) {
Optional<UserAnagEntity> entityOpt = this.userAnagRepository.findByUsername(userAnag.getUsername());
if (entityOpt.isPresent()) {
entity = entityOpt.get();
entity.setUpdatedAt(now);
//entity.setUpdateUser();
} else {
entity = new UserAnagEntity();
entity.setCreatedAt(now);
//entity.setCreatUser();
}
entity.fillEntityFromPojo(userAnag);
}
if (null != entity) {
this.userAnagRepository.save(entity);
}
}
第二种方法称为
public void saveAll(List<UserRolePermission> authorities) {
Calendar c = Calendar.getInstance();
Date now = c.getTime();
List<UserRolePermissionEntity> entities = Lists.newArrayListWithExpectedSize(authorities.size());
for (UserRolePermission urp : authorities) {
UserRolePermissionEntity entity = null;
if (null != urp.getUsername()) {
Optional<UserRolePermissionEntity> entityOpt = this.userRolePermissionRepository.findByUsernameAndRolenameAndPermission(urp.getUsername(), urp.getRolename(), urp.getPermission());
if (entityOpt.isPresent()) {
entity = entityOpt.get();
entity.fillEntityFromPojo(urp);
entity.setUpdatedAt(now);
// entity.setUpdateUser();
} else {
entity = new UserRolePermissionEntity();
entity.fillEntityFromPojo(urp);
entity.setCreatedAt(now);
// entity.setCreatUser();
}
entities.add(entity);
}
}
if (!entities.isEmpty()) {
String username = entities.get(0).getUsername();
this.userRolePermissionRepository.deleteByUsername(username);
this.userRolePermissionRepository.flush();
this.userRolePermissionRepository.saveAll(entities);
}
}
最后一个。
我期望的是,如果其中一种保存方法失败,则其他方法将回滚,但现在如果其中一种方法失败,则其他方法将执行相同的操作,因此我仅将部分数据保存在数据库中。
我的代码有什么问题?
解决方案
推荐阅读
- react-admin - HATEOAS 后端?
- javascript - 纱线启动突然停止工作,它显示“纱线运行 v1.22.10 bash: react-scripts: command not found error Command failed with exit code 127”
- java - 如何使用其他方法的整数
- python - Liclipse 不接受来自 3D Slicer 调试器的连接
- c++ - 来自代码块的 exe 文件接受输入,但不会做它应该做的事情
- javascript - 将数组的 2 个元素与另外 2 个元素随机交换
- javascript - 控制变换:scaleX 和变换:scaleY 使用滑块在同一对象上独立使用 javascript
- java - 在 Java 和 Android Studio 中进行简单测验时遇到问题
- node.js - NodeJS等待解决的承诺
- r - lavaan 错误:数据集中缺少观察到的变量:..constant