在DAO层之外使用@org.springframework.transaction.annotation.Transactional是否可行?

4

我有一个非常经典的问题:在DAO之外访问懒加载集合,导致LazyInitializationException。

在服务层的某些方法中使用@Transactional是否是一种干净且合理的解决方案,以便在DAO之外使用这些懒加载集合?

谢谢

2个回答

7

是的,确实如此。知道哪些任务必须成为工作单元(事务)的人是服务,因为它是“了解”业务的人。


1
+1. 使用事务型DAO而不是服务是一种不良的实践。 - Bozho

2
Neuquino给出了正确的答案,但是不够清晰易懂,所以我来尝试重新表述一下:通常情况下,一个服务方法对应一次事务,因此在服务层上加上@Transactional注解而不是在DAO层上加。Spring @Transactional注解的好处是它独立于底层实现,因此服务层中通常不会有针对持久化层的特定代码,例如不会调用Hibernate的Session或JPA的EntityManager。在对DAO进行单元测试时,将@Transactional注解放在测试方法上(你的测试是服务而不是DAO)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接