我有一个非常经典的问题:在DAO之外访问Lazy Collection,导致LazyInitializationException。
这是一个干净而合理的解决方案,使用@Transactional
使用这些懒惰集合的DAO之外的一些服务方法吗?
由于
答案 0 :(得分:7)
是的。知道哪些任务必须是工作单元(交易)的人才是服务,因为它是“了解”业务的人。
答案 1 :(得分:2)
Neuquino has the right answer,但它不是很清晰易懂,所以我会尝试改写它:
您通常需要一个服务方法的一个事务,这就是您使用@Transactional
而不是DAO层注释服务层的原因。 (关于Spring @Transactional
注释的好处是它独立于底层实现,因此服务层中通常不应该有特定于持久层的代码,例如不调用hibernate {{1} }或JPA Session
)。单元测试DAO时,将EntityManager
注释放在测试方法上(您的测试是服务,而不是DAO)。