DAO和Repository模式有什么区别?

564

数据访问对象(DAO)和仓储库模式有何区别?我正在使用企业Java Beans(EJB3)、Hibernate ORM基础设施以及领域驱动设计(DDD)和测试驱动开发(TDD)作为设计技术开发应用程序。


Repository 是 Dao,因为它允许您访问/持久化数据,但是 Repository 基于模拟与数据集合的交互来定义更加精确。这个定义和预期的好处可以在 Eric Evans 的 DDD 中找到。 - Tristan
1
下面的答案中可以找到两种类型的解释:
  1. 它们在数据访问的抽象级别上有所不同;
  2. 它们完全没有区别,因为它们执行相同的任务,即隐藏访问数据的实现细节。
- Enfield Li
14个回答

2
根据Spring文档,没有明显的区别:
@Repository注解是任何满足存储库(也称为数据访问对象或DAO)角色或类型的类的标记。

2

如果我们考虑设计模式DAORepository的原始定义,它们看起来非常相似。主要区别在于字典和来源(Oracle vs. Fowler)。

引用:

  • DAO - “将数据资源的客户端接口与其数据访问机制分离”和“DAO实现了与数据源一起工作所需的访问机制。数据源可以是持久存储,如RDBMS,外部服务,如B2B交换,存储库,如LDAP数据库,或通过CORBA Internet Inter-ORB协议(IIOP)或低级套接字访问的业务服务。”

  • Repository - “使用类似集合的接口介于域和数据映射层之间,以访问域对象。”和“从概念上讲,Repository封装了存储在数据存储中的对象集和对它们执行的操作,提供了更面向对象的持久性层视图。Repository还支持实现域和数据映射层之间的清晰分离和单向依赖的目标。”

基于这些引用,设计模式都在域层和数据层之间进行通信。此外,Repository与ORM相关联,而DAO则是一个更通用的接口,用于从任何地方访问数据。


1

DAO(数据访问对象)并不总是明确与仅数据库相关联,

它可以只是访问数据的接口,这里的数据可以从DB/Cache或甚至REST(这些天不太常见,因为我们可以轻松地将它们分离在各自的Rest / IPC客户端中)中访问,

在这种方法中,Repo可以由任何ORM解决方案实现。如果底层Cache / Repo更改,则不会传播/影响服务/业务层。

DAO可以接受/返回域类型。考虑到学生域,相关的DAO类将是StudentDao。

StudentDao {

    StudentRepository, 
    StudentCache, 

    Optional<Student> getStudent(Id){

       // Use StudentRepository/StudentCache to Talk to DD & Cache 
       // Cache Type can be the same as Domain Type, DB Type(Entities) should be a Same/Different Type.
   
    }

    Student updateStudent(Student){

       // Use StudentRepository/StudentCache to Talk to DD & Cache 
       // Cache Type can be the same as Domain Type, DB Type(Entities) should be a Same/Different Type.
   
    }

}

DAO可以接受/返回子域类型。考虑一个学生域,它有一个子域,比如出勤/科目,将有一个DAO类StudentDao。

StudentDao {

    StudentRepository, SubjectRepository, AttendanceRepository
    StudentCache, SubjectCache, AttendanceCache

    Set<Subject> getStudentSubject(Id){

       // Use SubjectRepository/SubjectCache to Talk to DD & Cache 
       
    }

    Student addNewSubjectToStudent(ID, Subject){

       // Use SubjectRepository/SubjectCache to Talk to DD & Cache 
      
   
    }

}

-1
简单来说,仓库(Repositories)代表集合,而数据访问对象(DAOs)更接近于数据库,通常更加以表为中心。

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