L'ORM et DAO sont orthogonaux concepts. On a à faire avec la façon dont les objets sont mappés à des tables de base de données, l'autre est un modèle de conception pour l'écriture des objets d'accès aux données. Vous ne choisissez pas "entre" eux. Vous pouvez avoir l'ORM et DAO est la même, tout comme vous n'avez pas besoin d'un ORM pour utiliser le pattern DAO.
Cela dit, alors que vous n'avez jamais vraiment besoin de quelque chose, vous devez utiliser des DAOs. Le modèle se prête à la modularité du code. Vous conservez tous vos persistance de la logique en un seul endroit (la séparation des préoccupations, la lutte abstractions qui fuient). Vous vous permettez de test d'accès aux données séparément du reste de l'application. Et vous vous permettez de tester le reste de l'application isolées à partir des données d'accès, vous pouvez vous moquer de votre DAOs).
De Plus, à la suite de la DAO motif est facile, même si la mise en œuvre de l'accès aux données peut être difficile. Donc, il vous en coûte très peu (ou rien) et vous gagnez beaucoup.
EDIT --
Quant à votre exemple, votre méthode de connexion doit être dans une sorte de AuthenticationService. Vous pouvez gérer les exceptions il y a (dans la méthode de login). Si vous avez utilisé le Printemps, qu'il pouvait gérer un tas de choses pour vous: (1) les transactions, (2) l'injection de dépendance. Vous n'auriez pas besoin d'écrire vos propres opérations ou dao usines, vous avez juste à définir les limites de transaction autour de votre service méthodes, et de définir votre DAO implémentations de haricots et puis de fil à votre service.
EDIT2
La raison principale de l'utilisation du modèle à deux questions distinctes. Cela signifie que tout votre code de persistance est en un seul endroit. Un effet secondaire de ceci est, la testabilité et la facilité de maintenance, et le fait qu'il est plus facile de passer des implémentations plus tard. Si vous êtes à la construction d'Hibernate en fonction DAOs, vous pouvez absolument manipuler la session dans le DAO, c'est ce que vous êtes censé faire. L'anti-modèle, c'est quand persistance relative de code qui se passe à l'extérieur de la couche de persistance (loi des abstractions qui fuient).
Les Transactions sont un peu plus compliqué. Au premier coup d'œil, les transactions peut sembler être une préoccupation de la persistance, et ils le sont. Mais ils ne sont pas seulement une préoccupation de la persistance. Les Transactions sont également une préoccupation de vos services, de vos méthodes de service doit définir une "unité de travail", ce qui signifie, tout ce qui se passe dans un service méthode doit être atomique. Si vous utiliser hibernate transactions, alors vous allez avoir à écrire hibernate code de transaction à l'extérieur de votre DAOs, de définir les limites de transaction autour des services qui utilisent de nombreuses méthodes DAO.
Mais note que les transactions peuvent être indépendants de l'implémentation-vous avez besoin de transactions que vous utilisiez ou non mise en veille prolongée. Notez également que vous n'avez pas besoin d'utiliser la veille prolongée opération de machines, vous pouvez l'utiliser dans des conteneurs de transactions, de transactions JTA, etc.
Aucun doute que si vous n'utilisez pas de Printemps ou quelque chose de similaire, les transactions sont va être une douleur. Je recommande fortement d'utiliser le Printemps pour gérer vos transactions, ou les EJB spec où je crois que vous pouvez définir des transactions autour de vos services avec les annotations.
Consultez les liens suivants, pour conteneur de base de transactions.
Container-Managed Transactions
Des Sessions Et Les Transactions
Ce que je suis la collecte de ceci est que vous pouvez facilement définir les opérations à l'extérieur de la DAOs au niveau du service, et vous n'avez pas besoin d'écrire de code de transaction.
Un autre (moins élégant) alternative est de placer toutes les unités atomiques de travail dans les DAOs. Vous pourriez avoir CRUD DAOs pour les opérations simples, puis plus complexes DAOs qui ne sont plus de l'une des opérations CRUD. De cette façon, votre programmatique opérations de rester dans le DAO, et vos services pourrait appeler le plus compliqué DAOs, et ne pas avoir à vous soucier de la transaction.
Le lien suivant est un bon exemple de la façon dont le DAO de patron peut vous aider à simplifier le code
AO vs ORM(hibernate) modèle
(merci @daff)
Remarquez comment la définition de l'interface qu'il fait en sorte que vous avez une logique d'entreprise se soucie uniquement de la comportement de la UserDao. Il ne s'occupe pas de la mise en œuvre. Vous pourriez écrire un DAO de l'utilisation d'hibernate, ou tout simplement jdbc. Ainsi, vous pouvez modifier vos données d'accès mise en œuvre sans affecter le reste de votre programme.