Spring中的DAO和服务层:会话管理

时间:2010-04-02 12:27:37

标签: java hibernate spring

我是否正确理解DAO& amp;的原则服务层互连? DAO执行基础对象的提取,例如来自db的id。

服务层使用DAO对象,并且可以在一个函数中调用多于一种DAO方法。 因此,服务层必须:

  1. 实例化DAO实现对象

  2. 根据需要调用DAO的多个方法

  3. 如果Dao实现了接口,那么DAO接口是否必须有方法setSessionFactory()

    如何在Spring中声明性地标记:

    1. DAO对象

    2. 服务层方法和整体类

    3. 这样可以提供所需的东西吗?

3 个答案:

答案 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)

  • 将事务和会话管理保留为spring(通过内置事务管理器)。
  • 在您的DAO中使用sessionFactory.getCurrentSession() tp访问会话
  • 在DAO中注入SessionFactory
  • 在范围singleton
  • 中有DAO
  • 使用声明式交易(使用<aop@Transactional
  • 通过常规依赖注入将DAO注入服务对象。与服务类注入需要的方式相同。