Spring getCurrentSession()并保存sevaral对象

时间:2016-02-15 12:48:33

标签: spring transactional

目前,我使用openSession(),在具有经典dao和服务层的方法中开始并提交事务,并在其中保存/更新/删除多个对象。如果存在任何错误,我确信此方法中的任何保存/更新都没有完成。

是否可以通过getCurrentSession()在使用@Transactional注释调用的方法中保存多个对象,如果这可以保证此方法中的所有对象都保存/更新或者没有完成,那么它是否安全?如果可能的话,我如何在这种方法中使用回滚?

1 个答案:

答案 0 :(得分:1)

是的,您可以使用适当的事务语义。 @Transactional有一个名为rollbackFor = TypeOfException.class的媒体资源。默认情况下,它会回滚RuntimeException,但您可以为任何已检查的例外指定您自己或Exception

你应该有一个适当的传播,你也可以在@Transactional指定一个属性。请注意,如果设置propagation = REQUIRES_NEW并且现有事务调用此方法,则仅针对嵌套事务回滚。你想要实现的目标,我认为最常见的是指定propagation = REQUIRED - 这不会在自己的交易上运行,而是在现有交易上运行,这意味着在整个交易失败的情况下将回滚。