数据访问对象(DAO)和存储库模式之间的区别是什么?我正在开发一个应用程序,使用企业Java bean (EJB3), Hibernate ORM作为基础设施,领域驱动设计(DDD)和测试驱动开发(TDD)作为设计技术。


当前回答

DAO提供了对数据库/数据文件或任何其他持久性机制的抽象,因此,持久性层可以在不知道其实现细节的情况下进行操作。

而在Repository类中,可以在单个Repository方法中使用多个DAO类来从“应用程序角度”完成操作。因此,与其在域层使用多个DAO,不如使用存储库来完成它。 存储库是一个层,它可能包含一些应用逻辑,例如:如果数据在内存缓存中可用,那么从缓存中获取它,否则,从网络中获取数据并将其存储在内存缓存中,以便下次检索。

其他回答

存储库是更抽象的面向领域的术语,是领域驱动设计的一部分,它是领域设计的一部分,是一种公共语言,DAO是数据访问技术的技术抽象,存储库只关心管理现有数据和创建数据的工厂。

查看这些链接:

http://warren.mayocchi.com/2006/07/27/repository-or-dao/ http://fabiomaulo.blogspot.com/2009/09/repository-or-dao-repository.html

在一个非常简单的句子中:显著的区别是 存储库代表集合,而dao更接近数据库,通常更接近 table-centric。

DAO提供了一种更简单的方式从存储中获取数据,隐藏了丑陋的查询。

存储库也处理数据并隐藏查询等,但是,存储库处理业务/域对象。

存储库将使用DAO从存储中获取数据,并使用该数据恢复业务对象。

例如,一个DAO可以包含一些类似-的方法

 public abstract class MangoDAO{
   abstract List<Mango>> getAllMangoes();
   abstract Mango getMangoByID(long mangoID);
}

一个存储库可以包含一些像这样的方法

   public abstract class MangoRepository{
       MangoDao mangoDao = new MangDao;

       Mango getExportQualityMango(){

       for(Mango mango:mangoDao.getAllMangoes()){
        /*Here some business logics are being applied.*/
        if(mango.isSkinFresh()&&mangoIsLarge(){
           mango.setDetails("It is an export quality mango");
            return mango;
           }
       }
    }
}

这个教程帮助我很容易地理解了主要概念。

关键的区别在于存储库处理对聚合根的访问,而DAO处理对实体的访问。因此,存储库通常将聚合根的实际持久性委托给DAO。此外,由于聚合根必须处理其他实体的访问,那么它可能需要将这种访问委托给其他dao。

根据Spring文档,没有明显的区别:

@Repository注释是任何类的标记,该类满足 存储库(也称为数据访问对象)的角色或原型 或刀)。