在服务上使用@Transactional的正确方法

时间:2014-03-12 15:41:43

标签: java hibernate spring-transactions

我有一个服务,它使用多个DAO来完成一个工作单元,如下所示。 DAO通过创建会话和提交来获取数据/保存。在这种情况下,当dao自己管理会话时,为什么我需要在服务上进行事务处理?如果第二个DAO出现问题,第一个DAO中的数据已经提交,我该如何解决这种情况?

@Transactional
public boolean testService(SomeObject obj){

     userDao.save(obj.getUser()); // this dao gets the session from sessino factory and commits there itself.
     addressDao.save(obj.getAddress()); // something fails here, and the above line has already commited the data, so the data is not Atomic.

     return true;
}

1 个答案:

答案 0 :(得分:3)

通常,您不要将@Transactional放在DAO图层中,而是放在服务层中。 因此,我建议您从您的DAO中移除@Transactional,并将其保留在您的服务中。

在这种情况下,如果你的任何DAO出现问题,一切都会回滚。

但是,您可以根据自己的需要开始和完成交易。