数据访问对象(DAO)和存储库模式之间的区别是什么?我正在开发一个应用程序,使用Enterprise Java Beans (EJB3),Hibernate ORM作为基础架构,域驱动设计和测试驱动开发作为设计技术。
发布于 2011-12-18 14:29:02
DAO是data persistence的抽象。
Repository是的抽象,是对象的集合。
可以认为DAO更接近数据库,通常是以表为中心的。
Repository将被认为更接近域,仅在聚合根中处理。
可以使用DAO实现Repository,但您不会做相反的事情。
此外,Repository通常是一个更窄的接口。它应该是一个简单的对象集合,带有Get(id)、Find(ISpecification)、Add(Entity)。
像Update这样的方法适用于DAO,但不适用于Repository -当使用Repository时,对实体的更改通常由单独的UnitOfWork跟踪。
被称为Repository的实现实际上更像是DAO,这似乎是很常见的,因此我认为它们之间的区别有一些混淆。
发布于 2013-03-20 08:48:44
好吧,我想我可以更好地解释我在评论中放的东西:)。因此,基本上,您可以将这两者看作是相同的,尽管DAO是一种比Repository更灵活的模式。如果你想同时使用两者,你可以在你的DAO中使用Repository。下面我将对它们逐一进行解释:
存储库:
它是特定类型对象的存储库-它允许您搜索并存储特定类型的对象。通常它只处理一种类型的对象。例如,AppleRepository将允许您执行AppleRepository.findAll(criteria)或AppleRepository.save(juicyApple)。请注意,存储库使用的是域模型术语(而不是DB术语-与数据在任何地方的持久化方式无关)。
存储库很可能会将所有数据存储在同一个表中,而模式并不需要这样做。但是,它只处理一种类型的数据,这使得它在逻辑上连接到一个主表(如果用于DB持久化)。
DAO -数据访问对象(换句话说-用于访问数据的对象)
DAO是一个为您定位数据的类(它主要是一个查找器,但通常也用于存储数据)。该模式不会限制您存储相同类型的数据,因此您可以轻松地使用DAO来定位/存储相关对象。
例如,您可以很容易地拥有UserDao,它可以公开如下方法
Collection<Permission> findPermissionsForUser(String userId)
User findUser(String userId)
Collection<User> findUsersForPermission(Permission permission)所有这些都与用户(和安全性)相关,并且可以在同一DAO下指定。Repository并非如此。
最后
请注意,这两种模式的含义实际上是相同的(它们存储数据并抽象对数据的访问,它们都表示得更接近域模型,几乎不包含任何DB引用),但它们的使用方式可能略有不同,DAO更灵活/更通用,而Repository则更具体,仅限于一种类型。
发布于 2013-02-20 05:38:39
DAO和Repository模式是实现数据访问层(DAL)的两种方式。那么,让我们从DAL开始,首先。
访问数据库的面向对象应用程序必须有一些逻辑来处理数据库访问。为了保持代码的整洁和模块化,建议将数据库访问逻辑隔离到单独的模块中。在分层体系结构中,此模块是DAL。
到目前为止,我们还没有讨论任何特定的实现:只讨论了将数据库访问逻辑放在单独模块中的一般原则。
现在,我们如何实现这一原则?嗯,一种已知的实现方式是DAO模式,特别是使用Hibernate这样的框架。
DAO模式是一种生成DAL的方式,通常每个领域实体都有自己的DAO。例如,User和UserDao,Appointment和AppointmentDao等。带有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已经提供了一组类似集合的操作,那么还需要在其上添加一个额外的层吗?
https://stackoverflow.com/questions/8550124
复制相似问题