首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DAO和Repository模式之间的区别是什么?

DAO和Repository模式之间的区别是什么?
EN

Stack Overflow用户
提问于 2011-12-18 14:05:26
回答 12查看 195K关注 0票数 495

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

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2011-12-18 14:29:02

DAOdata persistence的抽象。

Repository的抽象,是对象的集合。

可以认为DAO更接近数据库,通常是以表为中心的。

Repository将被认为更接近域,仅在聚合根中处理。

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

此外,Repository通常是一个更窄的接口。它应该是一个简单的对象集合,带有Get(id)Find(ISpecification)Add(Entity)

Update这样的方法适用于DAO,但不适用于Repository -当使用Repository时,对实体的更改通常由单独的UnitOfWork跟踪。

被称为Repository的实现实际上更像是DAO,这似乎是很常见的,因此我认为它们之间的区别有一些混淆。

票数 567
EN

Stack Overflow用户

发布于 2013-03-20 08:48:44

好吧,我想我可以更好地解释我在评论中放的东西:)。因此,基本上,您可以将这两者看作是相同的,尽管DAO是一种比Repository更灵活的模式。如果你想同时使用两者,你可以在你的DAO中使用Repository。下面我将对它们逐一进行解释:

存储库:

它是特定类型对象的存储库-它允许您搜索并存储特定类型的对象。通常它只处理一种类型的对象。例如,AppleRepository将允许您执行AppleRepository.findAll(criteria)AppleRepository.save(juicyApple)。请注意,存储库使用的是域模型术语(而不是DB术语-与数据在任何地方的持久化方式无关)。

存储库很可能会将所有数据存储在同一个表中,而模式并不需要这样做。但是,它只处理一种类型的数据,这使得它在逻辑上连接到一个主表(如果用于DB持久化)。

DAO -数据访问对象(换句话说-用于访问数据的对象)

DAO是一个为您定位数据的类(它主要是一个查找器,但通常也用于存储数据)。该模式不会限制您存储相同类型的数据,因此您可以轻松地使用DAO来定位/存储相关对象。

例如,您可以很容易地拥有UserDao,它可以公开如下方法

代码语言:javascript
复制
Collection<Permission> findPermissionsForUser(String userId)
User findUser(String userId)
Collection<User> findUsersForPermission(Permission permission)

所有这些都与用户(和安全性)相关,并且可以在同一DAO下指定。Repository并非如此。

最后

请注意,这两种模式的含义实际上是相同的(它们存储数据并抽象对数据的访问,它们都表示得更接近域模型,几乎不包含任何DB引用),但它们的使用方式可能略有不同,DAO更灵活/更通用,而Repository则更具体,仅限于一种类型。

票数 139
EN

Stack Overflow用户

发布于 2013-02-20 05:38:39

DAO和Repository模式是实现数据访问层(DAL)的两种方式。那么,让我们从DAL开始,首先。

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

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

现在,我们如何实现这一原则?嗯,一种已知的实现方式是DAO模式,特别是使用Hibernate这样的框架。

DAO模式是一种生成DAL的方式,通常每个领域实体都有自己的DAO。例如,UserUserDaoAppointmentAppointmentDao等。带有Hibernate的DAO的一个例子:http://gochev.blogspot.ca/2009/08/hibernate-generic-dao.html

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

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

存储库模式不一定是建立在DAO之上的东西(有些人可能会这样认为)。如果DAO是使用支持上述操作的接口设计的,那么它就是Repository模式的一个实例。想想看,如果DAOs已经提供了一组类似集合的操作,那么还需要在其上添加一个额外的层吗?

票数 110
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8550124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档