我是否正确理解DAO& amp;的原则服务层互连? DAO执行基础对象的提取,例如来自db的id。
服务层使用DAO对象,并且可以在一个函数中调用多于一种DAO方法。 因此,服务层必须:
实例化DAO实现对象
根据需要调用DAO的多个方法
如果Dao实现了接口,那么DAO接口是否必须有方法setSessionFactory()
?
如何在Spring中声明性地标记:
DAO对象
服务层方法和整体类
这样可以提供所需的东西吗?
答案 0 :(得分:7)
我很惊讶没有其他人特别提到这一点,但是setSessionFactory()
的特定于实现的细节应该不在您的DAO界面中。通过在DAO接口中添加特定于Hibernate的类,您可以将DAO直接绑定到Hibernate。
使用接口和依赖注入的目的是允许您更改层(您的DAO)的实现细节(例如,您使用的ORM解决方案,或者您的数据来自Web服务与数据库)而不影响其他层。
如果将setSessionFactory
添加到DAO接口,那么使用此DAO的所有其他层都会发现并且与数据访问是通过Hibernate完成的事实相关联。这与您尝试使用接口和依赖注入实现的目标正好相反。
答案 1 :(得分:4)
对于我的项目,我编写了一个基类,它具有我所有DAO扩展的setSessionFactory()
方法。然后我用Spring连接我的DAO,以便它将SessionFactory
注入到每个DAO中。
Hibernate有一个SessionFactory.getCurrentSession()
所以如果你将SessionFactory
注入你的DAO并使用那个方法,那么Session
的范围将根据你的事务管理机制来定义。 / p>
如果您有这样的方法,这意味着什么:
@Transactional
public void doSomething(){
dao1.makeCall();
dao2.makeOtherCall();
}
在构造时注入每个DAO的SessionFactory
将使用相同的Session
。但仅限于该交易的范围。
答案 2 :(得分:2)
sessionFactory.getCurrentSession()
tp访问会话SessionFactory
。 singleton
<aop
或@Transactional
)