首页 > 解决方案 > 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);
    }
}

最后一个。

我期望的是,如果其中一种保存方法失败,则其他方法将回滚,但现在如果其中一种方法失败,则其他方法将执行相同的操作,因此我仅将部分数据保存在数据库中。

我的代码有什么问题?

标签: spring-bootspring-data-jpaspring-transactionsrollback

解决方案


推荐阅读