Hibernate DAO和存储库模式之间的区别是什么?

Hibernate DAO和存储库模式之间的区别是什么?,hibernate,domain-driven-design,ejb-3.0,repository-pattern,data-access-layer,Hibernate,Domain Driven Design,Ejb 3.0,Repository Pattern,Data Access Layer,数据访问对象(DAO)和存储库模式之间的区别是什么?我正在使用企业Java Beans(EJB3)、Hibernate ORM作为基础设施、域驱动设计(DDD)和测试驱动开发(TDD)作为设计技术开发一个应用程序。DAO是数据持久化的一个抽象 Repository是对象集合的抽象 DAO将被认为更接近数据库,通常以表为中心。 存储库将被视为更接近域,只处理聚合根 Repository可以使用DAO实现,但您不会做相反的事情 另外,存储库通常是一个较窄的接口。它应该只是一个对象的集合,带有Get(

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

DAO
数据持久化的一个抽象
Repository
是对象集合的抽象

DAO
将被认为更接近数据库,通常以表为中心。
存储库
将被视为更接近域,只处理聚合根

Repository
可以使用
DAO
实现,但您不会做相反的事情

另外,
存储库
通常是一个较窄的接口。它应该只是一个对象的集合,带有
Get(id)
Find(isspecification)
Add(Entity)

类似于
更新
的方法适用于
DAO
,但不适用于
存储库
——当使用
存储库
时,对实体的更改通常由单独的工作单元跟踪


看起来很常见的一种实现称为
存储库
,实际上更像是
DAO
,因此我认为它们之间的区别有些混淆。

存储库是更抽象的面向领域的术语,是域驱动设计的一部分,是域设计的一部分,也是一种通用语言,DAO是数据访问技术的技术抽象,存储库只涉及管理现有数据和创建数据的工厂

检查以下链接:


尝试找出DAO或存储库模式是否最适用于以下情况: 假设您希望为各种类型的数据源(如RDBMS、LDAP、OODB、XML存储库和平面文件)的持久化机制提供统一的数据访问API

如果有兴趣,也可参考以下链接:


坦率地说,这看起来像是语义上的区别,而不是技术上的区别。短语dataaccessobject根本不指“数据库”。而且,尽管你可以把它设计成以数据库为中心,但我想大多数人都会考虑这样做设计缺陷。 DAO的目的是隐藏数据访问机制的实现细节。存储库模式有何不同?据我所知,它不是。说存储库不同于DAO,因为您处理/返回的对象集合不正确;DAO还可以返回对象集合


我所读到的关于存储库模式的所有内容似乎都依赖于这一区别:坏的DAO设计与好的DAO设计(又名存储库设计模式)

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

DAO和存储库模式是实现数据访问层(DAL)的方法。那么,让我们先从DAL开始

访问数据库的面向对象应用程序必须具有一些处理数据库访问的逻辑。为了保持代码干净和模块化,建议将数据库访问逻辑隔离到单独的模块中。在分层体系结构中,该模块是DAL

到目前为止,我们还没有讨论任何特定的实现:只讨论将数据库访问逻辑放在单独模块中的一般原则

那么,我们如何实施这一原则呢?好的,一种已知的实现方法是DAO模式,特别是在Hibernate这样的框架中

DAO模式是生成DAL的一种方式,通常每个域实体都有自己的DAO。例如,
User
UserDao
Appointment
AppointmentDao
等。带有Hibernate的DAO示例:

那么什么是存储库模式?与DAO一样,存储库模式也是实现DAL的一种方式。存储库模式的要点是,从客户机/用户的角度来看,它应该看起来或表现为一个集合。行为类似于集合的意思并不是说它必须被实例化为
collection collection=new SomeCollection()
。相反,这意味着它应该支持诸如添加、删除、包含等操作。这是存储库模式的本质

实际上,例如在使用Hibernate的情况下,存储库模式是用DAO实现的。也就是说,DAL的实例可以同时是DAO模式和存储库模式的实例


存储库模式不一定是在DAO之上构建的(正如一些人所建议的)。如果DAO设计有支持上述操作的接口,那么它就是存储库模式的实例。想想看,如果DAO已经提供了一组类似于集合的操作,那么需要在其上添加一个额外的层吗?

好的,我想我可以更好地解释我在注释中添加的内容:)。 因此,基本上,您可以看到这两种模式是相同的,尽管DAO是一种比存储库更灵活的模式。如果您想同时使用这两种方法,您可以使用DAO-s中的存储库。我将在下面逐一解释:

存储库: 它是一个特定类型对象的存储库-它允许您搜索特定类型的对象并存储它们。通常它只处理一种类型的对象。例如,
AppleRepository
允许您执行
AppleRepository.findAll(标准)
AppleRepository.save(果汁苹果)
。 注th
Collection<Permission> findPermissionsForUser(String userId)
User findUser(String userId)
Collection<User> findUsersForPermission(Permission permission)
 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;
           }
       }
    }
}