Quelle est la différence entre les modèles DAO et Repository?


Quelle est la différence entre les Objets d'accès aux données (DAO) et les modèles de référentiel? Je développe une application en utilisant des Beans Java d'entreprise (EJB3), Hibernate ORM en tant qu'infrastructure et Domain-Driven Design (DDD) et Test-Driven Development (TDD) en tant que techniques de conception.

Author: TylerH, 2011-12-18

12 answers

DAO est une abstraction de persistance des données.
Repository est une abstraction de une collection d'objets.

DAO serait considéré comme plus proche de la base de données, souvent centrée sur la table.
Repository serait considéré plus proche du Domaine, ne traitant que des racines agrégées.

Repository pourrait être implémenté en utilisant DAO, mais vous ne feriez pas le contraire.

De plus, un Repository est généralement une interface plus étroite. Ce devrait être simplement une collection de les objets, avec un Get(id), Find(ISpecification), Add(Entity).

Une méthode comme Update est approprié sur un DAO, mais pas un Repository - lors de l'utilisation d'un Repository, change d'entités généralement suivis par des UnitOfWork.

Il semble courant de voir des implémentations appelées a Repository qui est vraiment plus a DAO, et donc je pense qu'il y a une certaine confusion sur la différence entre elles.

 527
Author: quentin-starin, 2019-05-26 10:01:25

OK, pense que je peux mieux expliquer ce que j'ai mis dans les commentaires :). Donc, fondamentalement, vous pouvez voir les deux comme les mêmes, bien que DAO soit un modèle plus flexible que Repository. Si vous voulez utiliser les deux, vous utiliseriez le référentiel dans votre DAO-s. Je vais expliquer chacun d'eux ci-dessous:

DÉPÔT:

C'est un dépôt d'un type spécifique d'objets - il vous permet de rechercher un certain type d'objets ainsi que de les stocker. Habituellement, il ne gère qu'un seul type d'objets. Par exemple AppleRepository permettrait de faire AppleRepository.findAll(criteria) ou AppleRepository.save(juicyApple). Notez que le référentiel utilise des termes de modèle de domaine(pas des termes de base de données-rien de lié à la persistance des données partout).

Un référentiel stockera très probablement toutes les données dans la même table, alors que le modèle ne l'exige pas. Le fait qu'il ne gère qu'un seul type de données le rend logiquement connecté à une table principale (s'il est utilisé pour la persistance DB).

DAO-objet d'accès aux données (en d'autres termes - objet utilisé pour accéder données)

Un DAO est une classe qui localise des données pour vous (il s'agit principalement d'un finder, mais il est couramment utilisé pour stocker également les données). Le modèle ne vous empêche pas de stocker des données du même type, vous pouvez donc facilement avoir un DAO qui localise/stocke des objets associés.

Par exemple, vous pouvez facilement avoir UserDao qui expose des méthodes comme

Collection<Permission> findPermissionsForUser(String userId)
User findUser(String userId)
Collection<User> findUsersForPermission(Permission permission)

Tous ceux-ci sont liés à l'utilisateur (et à la sécurité) et peuvent être spécifiés sous le même DAO. Ce n'est pas le cas pour Référentiel.

Enfin

Notez que les deux modèles signifient vraiment la même chose (ils stockent des données et ils en abstraient l'accès et ils sont tous deux exprimés plus près du modèle de domaine et ne contiennent pratiquement aucune référence DB), mais la façon dont ils sont utilisés peut être légèrement différente, DAO étant un peu plus flexible/générique, tandis que Repository est

 132
Author: Stef, 2020-06-20 09:12:55

DAO et le modèle de référentiel sont des moyens d'implémenter la couche d'accès aux données (DAL). Commençons donc par DAL, d'abord.

Les applications orientées objet qui accèdent à une base de données doivent avoir une certaine logique pour gérer l'accès à la base de données. Afin de garder le code propre et modulaire, il est recommandé que la logique d'accès à la base de données soit isolée dans un module séparé. Dans l'architecture en couches, ce module est DAL.

Jusqu'à présent, nous n'avons pas parlé de mise en œuvre particulière: seulement un général principe qui met la logique d'accès à la base de données dans un module séparé.

Maintenant, comment pouvons-nous mettre en œuvre ce principe? Eh bien, un moyen connu de mettre en œuvre cela, en particulier avec des frameworks comme Hibernate, est le modèle DAO.

Le modèle DAO est un moyen de générer DAL, où généralement, chaque entité de domaine a son propre DAO. Par exemple, User et UserDao, Appointment et AppointmentDao, etc. Un exemple de DAO avec Hibernate: http://gochev.blogspot.ca/2009/08/hibernate-generic-dao.html.

Alors qu'est-ce que le modèle de référentiel? Comme DAO, le modèle de référentiel est également un moyen d'atteindre DAL. Le point principal dans le modèle de référentiel est que, du point de vue du client/utilisateur, il doit ressembler ou se comporter comme une collection. Ce que l'on entend par se comporter comme une collection n'est pas qu'elle doit être instanciée comme Collection collection = new SomeCollection(). Au lieu de cela, cela signifie qu'il devrait prendre en charge des opérations telles que add, remove, contains, etc. C'est le essence du modèle de référentiel.

En pratique, par exemple dans le cas de l'utilisation de Hibernate, le modèle de référentiel est réalisé avec DAO. C'est-à-dire qu'une instance de DAL peut être à la fois une instance de modèle DAO et un modèle de référentiel.

Le modèle de référentiel n'est pas nécessairement quelque chose que l'on construit au-dessus de DAO (comme certains peuvent le suggérer). Si les DAO sont conçus avec une interface qui prend en charge les opérations mentionnées ci-dessus, il s'agit d'une instance de modèle de référentiel. Penser si les DAO fournissent déjà un ensemble d'opérations de type collection, alors quel est le besoin d'une couche supplémentaire par-dessus?

 103
Author: Nazar Merza, 2013-10-21 07:54:49

Franchement, cela ressemble à une distinction sémantique, pas une distinction technique. L'expression Objet d'accès aux données ne fait pas du tout référence à une "base de données". Et, bien que vous puissiez le concevoir pour qu'il soit centré sur la base de données, je pense que la plupart des gens considéreraient cela comme un défaut de conception.

Le but du DAO est de masquer les détails de mise en œuvre du mécanisme d'accès aux données. En quoi le modèle de référentiel est-il différent? Pour autant que je sache, ce n'est pas le cas. Dire qu'un référentiel est différent d'un DAO parce que vous traitez/renvoyez une collection d'objets ne peut pas être correct; les DAO peuvent également renvoyer des collections d'objets.

Tout ce que j'ai lu sur le modèle de référentiel semble reposer sur cette distinction: mauvais design DAO vs bon design DAO (aka modèle de conception de référentiel).

 87
Author: rakehell404, 2015-10-13 11:13:41

Le référentiel est un terme orienté domaine plus abstrait qui fait partie de la conception pilotée par domaine, il fait partie de votre conception de domaine et d'un langage commun, DAO est une abstraction technique pour la technologie d'accès aux données, le référentiel ne concerne que la gestion des données existantes et des usines pour la création de données.

Vérifiez ces liens:

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

 17
Author: Mohamed Abed, 2012-10-24 16:03:22

La principale différence est qu'un référentiel gère l'accès aux racines d'agrégat dans un agrégat, tandis que DAO gère l'accès aux entités. Par conséquent, il est courant qu'un référentiel délègue la persistance réelle des racines agrégées à un DAO. De plus, comme la racine agrégée doit gérer l'accès des autres entités, elle peut avoir besoin de déléguer cet accès à d'autres DAO.

 6
Author: pablochacin, 2012-07-18 17:06:42

DAO fournit une abstraction sur les fichiers de base de données/données ou tout autre mécanisme de persistance afin que la couche de persistance puisse être manipulée sans connaître les détails de son implémentation.

Alors que dans les classes de référentiel, plusieurs classes DAO peuvent être utilisées dans une seule méthode de référentiel pour effectuer une opération du point de vue de l'application. Ainsi, au lieu d'utiliser plusieurs DAO au niveau de la couche de domaine, utilisez repository pour le faire. Le référentiel est une couche qui peut contenir une logique d'application comme: Si des données sont disponibles dans le cache en mémoire, récupérez-les du cache sinon, récupérez les données du réseau et stockez-les dans le cache en mémoire pour la prochaine récupération.

 4
Author: Rahul Rastogi, 2019-11-16 07:01:36

Les dépôts ne sont rien d'autre que des DAO bien conçus.

ORM sont centrés sur la table mais pas DAO.

Il n'est pas nécessaire d'utiliser plusieurs DAO dans le référentiel car DAO lui-même peut faire exactement la même chose avec les référentiels/entités ORM ou tout fournisseur DAL, peu importe où et comment une voiture est conservée 1 table, 2 tables, n tables, une demi-table, un service Web, une table et un service Web, etc. Les services utilisent plusieurs DAO / dépôts.

Mon propre DAO, disons que CarDao ne traite que de la voiture DTO, je veux dire, ne prenez que Car DTO en entrée et ne renvoyez que car DTO ou car DTO collections en sortie.

Donc, tout comme le référentiel, DAO est en fait un IoC, pour la logique métier, permettant aux interfaces de persitence de ne pas être intimidées par des stratégies de persitence ou des héritages. DAO encapsule la stratégie de persistance et fournit l'interface de persistance liée au domaine. Référentiel est juste un autre mot pour ceux qui n'avaient pas compris ce qu'était un DAO bien défini en réalité.

 3
Author: Cyril, 2013-08-12 15:07:05

Essayez de savoir si DAO ou le modèle de référentiel est le plus applicable à la situation suivante : Imaginez que vous souhaitiez fournir une API d'accès aux données uniforme pour un mécanisme persistant à différents types de sources de données telles que les SGBDR, LDAP, OODB, les référentiels XML et les fichiers plats.

Reportez-vous également aux liens suivants, si intéressé:

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

 2
Author: javaDisciple, 2011-12-19 06:09:51

Dans le framework spring, il y a une annotation appelée le référentiel, et dans la description de cette annotation, il y a des informations utiles sur le référentiel, ce qui, je pense, est utile pour cette discussion.

Indique qu'une classe annotée est un "référentiel", à l'origine défini par Domain-Driven Design (Evans, 2003) comme "un mécanisme pour encapsuler le stockage, la récupération et le comportement de recherche qui émule un collection d'objets".

Équipes mise en œuvre de modèles Java EE traditionnels tels que "l'accès aux données Object " peut également appliquer ce stéréotype aux classes DAO, bien que care devrait être pris pour comprendre la distinction entre l'accès aux données Objet et dépôts de style DDD avant de le faire. Cette annotation est un stéréotype général et des équipes individuelles peuvent réduire leur sémantique et utilisation appropriée.

Une classe ainsi annotée est éligible pour Spring DataAccessException traduction lorsqu'elle est utilisée conjointement avec un PersistenceExceptionTranslationPostprocessor. La classe annotée est également clarifié quant à son rôle dans l'architecture globale de l'application pour l'outillage, les aspects, etc.

 1
Author: Ali Yeganeh, 2020-05-15 10:45:01

A DAO permet un moyen plus simple d'obtenir des données à partir du stockage, en cachant les requêtes laides.

Le référentiel traite aussi des données et cache les requêtes et tout cela, mais un référentiel traite objets métier / domaine.

Un référentiel utilisera un DAO pour obtenir les données du stockage et utilise ces données pour restaurer un objet métier.

Par exemple, Un DAO peut contenir des méthodes comme celle-ci -

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

Et un Référentiel peut contenir une méthode comme celle -

   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;
           }
       }
    }
}

Ce tutoriel m'a aidé à obtenir le concept principal facilement.

 1
Author: Gk Mohammad Emon, 2020-07-20 18:54:59

En une phrase très simple: La différence significative étant ces dépôts représentent des collections, tandis que les DAO sont plus proches de la base de données, étant souvent beaucoup plus table-centrique.

 -1
Author: Monsieur Aliréza, 2018-11-17 17:04:00