你应该将放置@Transactional在DAO类和/或它们的方法中,还是更好地注释使用DAO对象调用的Service类?还是对两个“层”都进行注释是否有意义?
@Transactional
Service
我认为交易属于服务层。这是了解工作单元和用例的人。如果您将多个DAO注入到一个服务中,而这些DAO需要在单个事务中一起工作,那么这是正确的答案。
总的来说,我同意其他人的看法,即交易通常在服务级别上开始(当然,这取决于你所需的粒度)。
但是,与此同时,我也开始添加@Transactional(propagation = Propagation.MANDATORY)到我的DAO层(以及其他不允许启动事务但需要已有事务的层),因为在你忘记在调用方中开始事务的地方,错误检测要容易得多(例如服务)。如果你的DAO带有强制传播注释,你将获得一个异常,指出在调用该方法时没有活动的事务。
@Transactional(propagation = Propagation.MANDATORY)
我还有一个集成测试,在该测试中,我检查所有bean(bean后处理器)是否有此注释,如果@Transactional在不属于服务层的bean中存在非强制传播的注释,则失败。这样,我确保我们不会在错误的层上启动事务。