说我有以下代码段
@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()
方法。
答案 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();