пружинная загрузка 2 + транзакции отката данных jpa данных - PullRequest
0 голосов
/ 18 марта 2020

У меня есть проект с весенней загрузкой 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);
    }
}

последний.

Я ожидаю, что если один из методов сохранения потерпит неудачу, другие откатятся, но теперь, если один не удалось, остальные выполняются так же, поэтому у меня есть только частичные данные, сохраненные в БД.

Что не так в моем коде?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...