Une DAO doit donner accès à un seul connexe et, en fonction de la complexité de votre modèle d'entreprise, elle renverra soit des objets d'entreprise à part entière, soit de simples objets de données. Dans tous les cas, les méthodes DAO doivent refléter la base de données de manière assez proche.
Un service peut fournir une interface de niveau supérieur non seulement pour traiter vos objets commerciaux, mais aussi pour y accéder. Si j'obtiens un objet métier d'un service, cet objet peut être créé à partir de différentes bases de données (et de différents DAO), il peut être décoré avec des informations provenant d'une requête HTTP. Il peut être doté d'une certaine logique commerciale qui convertit plusieurs objets de données en un objet commercial unique et robuste.
Je crée généralement un DAO en pensant qu'il sera utilisé par tous ceux qui vont utiliser cette base de données, ou un ensemble de données liées à l'entreprise. Il s'agit littéralement du code de plus bas niveau, en dehors des déclencheurs, des fonctions et des procédures stockées dans la base de données.
Réponses à des questions spécifiques :
Je me demandais si un DAO pouvait contenir des méthodes qui n'ont pas vraiment l'accès aux données, mais qui sont mais qui sont beaucoup plus faciles à exécuter à l'aide d'une requête ?
Dans la plupart des cas, non, vous voudriez que votre logique d'entreprise la plus compliquée soit dans votre couche de service, l'assemblage des données à partir de requêtes séparées. Cependant, si la vitesse de traitement vous préoccupe, une couche de service peut déléguer une action à un DAO même si cela brise la beauté du modèle, de la même manière qu'un programmeur C++ peut écrire du code assembleur pour accélérer certaines actions.
Il me semble qu'il s'agit plutôt d'un méthode de la couche de service, mais je ne suis pas certain si utiliser JPA EntityManager dans la couche de service couche service est un exemple de bonne pratique ?
Si vous comptez utiliser votre gestionnaire d'entités dans votre service, considérez-le comme votre DAO, car c'est exactement ce qu'il est. Si vous devez supprimer une construction de requête redondante, ne le faites pas dans votre classe de service, extrayez-la dans une classe qui utilise le gestionnaire d'entités et faites-en votre DAO. Si votre cas d'utilisation est vraiment simple, vous pouvez sauter la couche de service entièrement et utiliser votre gestionnaire d'entité, ou DAO dans les contrôleurs parce que tout ce que votre service va faire est de passer des appels à getAirplaneById()
de la DAO findAirplaneById()
MISE À JOUR - Pour clarifier la discussion ci-dessous, l'utilisation d'un gestionnaire d'entités dans un service n'est probablement pas la meilleure décision dans la plupart des situations où il y a également une couche DAO pour diverses raisons soulignées dans les commentaires. Mais à mon avis, ce serait parfaitement raisonnable étant donné :
- Le service doit interagir avec différents ensembles de données
- Au moins un ensemble de données a déjà un DAO.
- La classe de service réside dans un module qui nécessite une certaine persistance qui est suffisamment simple pour ne pas justifier son propre DAO.
exemple.
//some system that contains all our customers information
class PersonDao {
findPersonBySSN( long ssn )
}
//some other system where we store pets
class PetDao {
findPetsByAreaCode()
findCatByFullName()
}
//some web portal your building has this service
class OurPortalPetLostAndFoundService {
notifyOfLocalLostPets( Person p ) {
Location l = ourPortalEntityManager.findSingle( PortalUser.class, p.getSSN() )
.getOptions().getLocation();
... use other DAO's to get contact information and pets...
}
}