40 votes

J'ai trouvé JPA, ou similaire, n'encourage pas le motif DAO

J'ai trouvé JPA, ou semblables, n'encouragent pas le pattern DAO. Je ne sais pas, mais je me sens comme ça, surtout avec le serveur géré JTA gestionnaires.

Une fois les mains sur l'aide de DAO schéma, j'ai commencé à concevoir JPA application basée autour de ce modèle. Mais il ne rentre pas dans les, de l'OMI. J'ai tendance à perdre tout à fait, une des caractéristiques de la JPA et tous.

Eh bien, supposons que vous lancez une requête avec le verrouillage pessimiste et il a renvoyé une liste d'entités à partir d'une méthode DAO. À son retour, la transaction se termine et de verrouillage est allé (un cas avec le serveur géré JTA manager). Donc, pas de point, globalement parlant. Il y a des cas valides, bien que.

Un autre exemple est beaucoup plus trivial. Supposons que vous lancez une requête pour obtenir une certaine entité, qui a un chargement différé de un-à-plusieurs association avec une autre entité. Dès le retour à la méthode DAO, la transaction se termine. Le chargement paresseux ne fonctionne plus, vous obtenez tout simplement null ou quelque chose. Pour faire face à cela nous charger manuellement avec impatience. nous faisons quelque chose comme a.getBList().size().

Ainsi, de l'OMI, de son mieux pour ne pas faire une DAO exclusivement, et de le faire dans votre entreprise, de haricots, de cette façon vous serez en mesure de profiter de ces fonctionnalités utiles. Ou ORM API peut être considéré comme un DAO/Données de la couche elle-même, sans doute. Donc, nous n'avons pas besoin de faire un autre.

Ce que vous les gens pensent à ce sujet?

Note: je ne dis pas, par tout moyen, que le DAO modèle est obsolète. En effet, il dépend d'un cas à l'autre.

47voto

Pascal Thivent Points 295221

Pour les applications simples, je ne vois pas de problème dans l'utilisation de l' EntityManager directement à partir des Ejb et le saut de l'pattern DAO (je suis fatigué d'écrire trop de code). Et mon sentiment est, en effet, que c'est ce que JPA et l'API Java EE encourager. Mais il peut encore être justifié pour des applications plus complexes (pour l'accès aux données à partir d'une procédure stockée, fichiers plats...). Donc, vous avez raison, ça dépend :)

Vous trouverez quelques autres illuminés d'un point de vue dans A JPA Tué le DAO? sur InfoQ mais vous ne serez pas surpris par le contenu et la conclusion qui peut être ainsi résumée: vous n'avez pas vraiment besoin de la DAO motif de plus pour le standard d'accès aux données, vous pouvez cependant avoir besoin d'elle pour certaines situations plus complexes, mais nous vivons mieux sans elle.

31voto

Bozho Points 273663

Si vous ne définissez pas le DAO être transactionnel, vous n'aurez pas ces problèmes.

La couche de service est censé être transactionnelle, car une transaction est censé s'étendre sur plusieurs opérations. Mettre chaque insérer/mettre à jour dans une transaction qui n'est pas le meilleur scénario.

Avec le printemps vous parvenir très facilement. Sans elle, vous peut-être inclure la transaction logique dans votre DAO de nouveau - c'est-àdire dao.beginTransaction() et dao.commitTransaction() et l'utiliser à partir de la couche de service à la place.

Si je comprends bien, vous suggérez que l'utilisation de l' EntityManager directement dans les classes de service est probablement mieux que d'avoir un wrapper DAO classe. Je ne suis pas d'accord pour une raison. De travail de la classe DAO (interface au mieux) dans vos classes de service, vous n'avez pas de dépendance sur l'API JPA à tous. Vous n'avez pas à construire Query objets ou les goûts. Cela pourrait ne pas être un grand avantage, mais vous seriez d'accord que c'est une bonne pratique. Et vous pouvez passer, plus tard, à la plaine de JDBC, XML en texte brut, ou que ce soit, en changeant seulement le DAO.

Ce, bien que largement utilisé comme un exemple de pourquoi vous devriez abstrait quelque chose dans une autre couche, est le plus souvent simplement un overdesign. Mais parfois, le fait que l'ensemble de votre base de données access opérations de passer par un endroit signifie que vous pouvez ajouter les journaux, des vérifications d'accès, etc. (Oui, parfois, le DAO n'est pas un moyen de le faire).

Donc, finalement, pour revenir à votre point - ça dépend.

3voto

Elton Points 116

DAO est utilisé pour la conception, tandis que JPA est un wrapper "officiel" pour les fonctions d'accès aux données. JPA n'essaie en aucun cas de tuer DAO - cela peut en faciliter la mise en œuvre, peut-être si facile que DAO a l'air si simple qu'il peut être ignoré. Mais sans la couche DAO, les avantages en termes de conception n'existent plus.

Bien sûr, pour les projets "simples", cela peut être ignoré. Beaucoup de choses peuvent être "ignorées" si le projet est suffisamment "simple".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X