У меня есть проект с весенней загрузкой 2 с использованием данных jpa для постоянства. У меня есть менеджер с методом, который внутри вызывает 3 различных метода сохранения. каждое сохранение находится в сервисе, аннотированном как транзакционный на уровне класса. Также метод менеджера аннотирован как транзакционный. БД - это Pastge SQL
, метод менеджера -
@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);
}
}
последний.
Я ожидаю, что если один из методов сохранения потерпит неудачу, другие откатятся, но теперь, если один не удалось, остальные выполняются так же, поэтому у меня есть только частичные данные, сохраненные в БД.
Что не так в моем коде?