我的交易有问题。 我有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所有的保存功能,在服务,但它也不能工作。 有人可以帮我吗?