如何在@Transactional方法中立即执行保存操作

时间:2018-09-13 07:35:26

标签: spring jpa spring-data

说我有以下代码段

@Transactional
public void doSthing(){
     // save an enetity to db
    SomeClass entityA = new entityA();
    mapper.save(entityA);
    // I got null here!
    Integer id = entityA.getId();
    anotherEntity.setVal(id);
    otherMapper.upate(anotherEntity)

}

如您所见,我需要entityA的id来更新另一个实体,但是那个时候是null,如果我删除了@Transactional的话,但是我希望两个操作同时进行,表示我需要在任何操作失败的情况下春季回滚doSthing()方法。

2 个答案:

答案 0 :(得分:2)

默认情况下,用@Transactional注释的方法将在任何RuntimeException上回滚。因此,您可以通过在某些情况下抛出一些运行时异常来实现回滚。

如果要回滚任何例外,只需添加以下内容:

@Transactional(rollbackFor=Exception.class)

但是@Delinum注释中的内容通常是正确的,也就是说,如果您在dao /存储库上调用保存,则应为要保存的值对象分配@Id,使其成为实体。

答案 1 :(得分:1)

我不知道您的“映射器”实例的类型是什么,但是某些实现可能会以某种方式工作,即在您调用save时,它不会更改原始对象,而是会返回持久对象。所以代替这个:

mapper.save(entityA);
// I got null here!
Integer id = entityA.getId();

使用此:

Integer id = mapper.save(entityA).getId();