Hibernate et Spring - Dao ,Services
J'ai lu quelques tutoriels et j'ai pu voir que la plupart de la MVC implémentations
sont basées sur:
1) une interface dao par exemple "IUserDao"
2) un dao impl de cette interface - "mySimpleUserDaoImpl"
3) une interface de service de persistance : "IUserService"
4) et une impl - "UserServiceImpl"
est-ce la meilleure pratique? je veux dire la raison pour laquelle je pose cette question c'est parce qu'il semble superflu d'avoir 30 services avec getXById(), deleteX(x), createX(x) des méthodes qui font plus ou moins la même.
veuillez prendre en compte que je suis en utilisant le printemps 3 et hibernate 4, et j'ai décidé que je vais poser cette question avant de commencer à en claquant mon clavier avec le code
grâce.
I
préfixe pour les interfaces. L'utilisateur ne devrait pas être conscients, c'est d'obtenir une interface. Appelez UserDAO
et UserService
.Accepté, de supprimer la je sur les interfaces. Personnellement, j'appelle mes classes Dao Référentiels juste pour le garder en ligne avec le Printemps, les Annotations, mais il n'a pas d'importance.
des tutoriels pour une technologie habituellement ne sont pas concernés par la logique d'entreprise de sorte qu'ils ne sont pas de bonnes références. il y a une question similaire qui pourraient vous être utiles, à stackoverflow.com/q/3688664/217324
Une autre chose à noter à propos de la couche de Service est c'est où votre @Transaction devrait commencer. Donc, si vous voulez annuler une transaction entre plusieurs référentiels le niveau de service est où vous le faites. C'est pourquoi, le Service devrait être l'Un-à-Plusieurs avec des Dépôts.
OriginalL'auteur Urbanleg | 2013-05-14
Vous devez vous connecter pour publier un commentaire.
Si vous êtes juste de commencer le développement, regarder dans Spring JPA. Un service qui devrait être l'Un-à-Plusieurs Référentiels (DAO). Mais je voudrais également de ne pas créer tous que le code réutilisable par la main plus. Spring JPA élimine le CRUD de base et des fonctions de recherche ainsi que la pagination.
Voici une vidéo qui marche à travers l'ensemble de la configuration de Spring, JPA, Hibernate, et se termine avec Spring Data JPA vous montrant tous les code réutilisable qui est éliminé.
Utilisation de Spring Data JPA, votre référentiel d'interface finit par être:
Et puis la configuration XML à utiliser Spring Data JPA:
Tous les code réutilisable est maintenant pris en charge pour vous. Vous n'avez plus besoin de créer une base de dépôt de la classe avec des méthodes de recherche et de base CRUD fonctions. Le
JpaRepository
interface offre beaucoup de fonctionnalités intéressantes, et vous n'avez pas n'importe quoi pour la mise en œuvre.OriginalL'auteur bh5k
Son nécessaire de disposer d'dao, daoImpl, service, serviceImpl pour chaque modèle.
Vous pouvez utiliser une classe générique EntityDaoImpl anf l'inteface EntityDao, comme ceci:
EntityDao:
EntityDaoImpl:
Et vous pouvez l'utiliser comme ceci:
et
Il y a en fait quelques erreurs avec ce code, vous ne voulez pas commencer à effectuer vos transactions dans le DAO/Référentiel de niveau.
OriginalL'auteur 3d5oN
Non, il n'est pas besoin d'avoir 30 couches de service ou 30 dao couches.vous devez spécifier les couches de ne pas considérer l'Entité sage, mais la fonctionnalité commerciale sage.il peut y avoir 5 ou 6 entités pertinentes pour certaines fonctions et ceux-ci devraient être dans une couche.Mais encore, vous devez avoir getXById(), deleteX(x), createX(x) dans ces redondant couches si nécessaire.
OriginalL'auteur Sanjaya Liyanage
La création d'un service distinct pour chaque modèle est une façon de le faire, et j'ai vu des applications du monde réel que cela, mais je ne le recommande pas. C'est overkill pour la simple CRUD cas et est inutile pour les cas plus complexes (où vous voulez vraiment une opération sur plusieurs DAO appels). Il vous laisse avec beaucoup de code qui ne fait pas beaucoup. Le Bcm peut être spécifié à l'aide de Données du Printemps, les services seront réutilisable à chaque méthode d'emballage d'un appel à un DAO. Le printemps devrait aider à réduire réutilisable plutôt que d'imposer.
Si vous avez un tout CRUD l'application ne peut légitimement le faire sans les services, @Transactional sur les DAOs, et d'appeler la DAO à partir du Contrôleur. Si le service n'est pas en tirant sur son poids, se débarrasser de lui.
Si vous avez la logique métier de l'application, puis lorsqu'un utilisateur appelle quelque chose qui peut impliquer des appels à différents DAOs, ces appels devraient généralement lieu dans la même transaction, de sorte que si une chose échoue tout est annulée. (Aussi la création d'une opération est relativement cher et si vous avez un contrôleur de faire des appels vers les différents services pour les différentes entités qui sera lente.) C'est là que les services de venir dans maniable, le service, précise le faible niveau des cas d'utilisation que l'utilisateur souhaite effectuer et permet transactionnelle comportement spécifié.
Pour le CRUD cas, je préfère utiliser un outil comme Graal ou de Jouer ou de Rails, ou quelque chose d'écrit en Java avec Spring MVC. Graal, par exemple, permettra de générer des vues et des contrôleurs pour vous, fournir des données de base l'accès par le biais de GORM (donc il n'y a pas DAOs à écrire), et il vous permettra de spécifier facilement, pour le cas où vous trouvez que vous avez besoin.
OriginalL'auteur Nathan Hughes