数据访问对象(DAO)和存储库模式之间的区别是什么?我正在开发一个应用程序,使用企业Java bean (EJB3), Hibernate ORM作为基础设施,领域驱动设计(DDD)和测试驱动开发(TDD)作为设计技术。
当前回答
在一个非常简单的句子中:显著的区别是 存储库代表集合,而dao更接近数据库,通常更接近 table-centric。
其他回答
尝试找出DAO或Repository模式是否最适用于以下情况: 假设您希望为各种类型的数据源(如RDBMS、LDAP、OODB、XML存储库和平面文件)的持久机制提供统一的数据访问API。
如果有兴趣,也可以参考以下链接:
http://www.codeinsanity.com/2008/08/repository-pattern.html
http://blog.fedecarg.com/2009/03/15/domain-driven-design-the-repository/
http://devlicio.us/blogs/casey/archive/2009/02/20/ddd-the-repository-pattern.aspx
http://en.wikipedia.org/wiki/Domain-driven_design
http://msdn.microsoft.com/en-us/magazine/dd419654.aspx
存储库是更抽象的面向领域的术语,是领域驱动设计的一部分,它是领域设计的一部分,是一种公共语言,DAO是数据访问技术的技术抽象,存储库只关心管理现有数据和创建数据的工厂。
查看这些链接:
http://warren.mayocchi.com/2006/07/27/repository-or-dao/ http://fabiomaulo.blogspot.com/2009/09/repository-or-dao-repository.html
根据Spring文档,没有明显的区别:
@Repository注释是任何类的标记,该类满足 存储库(也称为数据访问对象)的角色或原型 或刀)。
好吧,我想我可以更好地解释我在评论里写的东西:)。 因此,基本上,您可以看到两者是相同的,尽管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)
所有这些都与User(和安全性)相关,并且可以在同一个DAO下指定。对于Repository则不是这样。
最后
请注意,这两种模式实际上意味着相同的(它们存储数据并抽象对数据的访问,它们都更接近于域模型,几乎不包含任何DB引用),但它们的使用方式可能略有不同,DAO更灵活/泛型,而Repository更特定,仅对类型有限制。
存储库不过是设计良好的DAO。
ORM是以表为中心的,而不是DAO。
没有必要在存储库中使用多个DAO,因为DAO本身可以对ORM存储库/实体或任何DAL提供者做完全相同的事情,无论汽车在哪里以及如何持久化1个表、2个表、n个表、半个表、一个web服务、一个表和一个web服务等等。 服务使用多个DAO/存储库。
我自己的DAO,假设CarDao只处理Car DTO,我的意思是,只在输入中接收Car DTO只在输出中返回Car DTO或Car DTO集合。
因此,就像Repository一样,对于业务逻辑来说,DAO实际上是一个IoC,允许持久性接口不受持久性策略或遗留问题的影响。 DAO既封装了持久性策略,也提供了与域相关的持久性接口。 对于那些不理解定义良好的DAO实际上是什么的人来说,存储库只是另一个词。
推荐文章
- buildSessionFactory()配置方法在Hibernate中已弃用?
- 存储库和服务层的区别?
- DDD -实体不能直接访问存储库的规则
- JPA orphanRemoval=true如何不同于ON DELETE CASCADE DML子句
- 如何映射一个组合键与JPA和Hibernate?
- 如何使用旧版本的Hibernate(~2009)来计算行数?
- 我如何使JPA OneToOne关系变懒
- 混淆:@NotNull vs. @Column(nullable = false)与JPA和Hibernate
- Hibernate的第一级和第二级缓存是什么?
- Hibernate抛出org.hibernate.AnnotationException:没有为entity指定标识符:com..domain.idea.MAE_MFEView
- 如何在JPQL或HQL中进行限制查询?
- 如何修复org.hibernate.LazyInitializationException -不能初始化代理-没有会话
- Spring .jpa.hibernate.ddl-auto属性在Spring中是如何工作的?
- 当使用JPA和Hibernate时,JOIN和JOIN FETCH之间的区别是什么
- 服务应该总是返回dto,还是也可以返回域模型?