Spring Boot事务性不会回滚多个对象

时间:2019-02-02 17:22:11

标签: spring spring-boot

我的交易有问题。 我有4个实体-实体A,实体B,实体C和实体D-所有都是不同的对象(对于我数据库中的不同表)。 对于他们每个人,我都有一个看起来像这样的存储库:

@Repository
public interface entityXRepository extends JPARepository<entityX, Long> {}

(entityX为上述任意一项) 而且我还为每个entityB,entityC,entityD提供服务,如下所示:

@Service
public class entityXService {
    @Autowired
    entityXRepository repository;

    public entityX save(entityX toSave) {
        return repository.save(toSave);
    }
}

如您所见,我在保存时不使用@transactional。

我为entityA提供的服务如下:

@Service
public class entityAService {
    @Autowired
    entityARepository repository;

    public entityA save(entityA toSave) {
       return repository.save(toSave);
    }

    public void doSomeStuff(...) throws Exception {
        // do a lot of stuff and create entities for A,B,C,D and i throw exception 
        //if something happens here

        saveAllToDB(entityAToSave, entityBToSave, entityCToSave, entityDToSave);
    }

    @Transactional(rollbackFor = "Exception.class")
    public void saveAllToDB(entityA a, entityB b, entityC c, entityD d) {
        serviceA.save(a);
        if(b != null) {
          serviceB.save(b);
        }
        if(c != null) {
          serviceC.save(c);
        }
        if(d != null) {
          serviceD.save(d);
        }
    }
}

在doSomeStuff中,我从客户端获取输入并创建实体,如果输入违反某些规则,我会向用户抛出带有消息的异常。 如您所见,只有saveAllToDB是事务性的。 当保存像EntityD这样的实体之一时发生异常时,不会回滚,只有异常会被抛出到错误控制器,而实​​体A到B会保存在数据库中。 (为此检查,我向D输入了一个12位数字,而db列是10位数字)

我累了把@Transactional所有的保存功能,在服务,但它也不能工作。 有人可以帮我吗?

0 个答案:

没有答案