ORM y DAO son conceptos ortogonales. Uno tiene que ver con la forma en que los objetos se asignan a las tablas de la base de datos, el otro es un patrón de diseño para escribir objetos que acceden a los datos. No eliges 'entre' ellos. Puede tener ORM y DAO es la misma aplicación, del mismo modo que no necesita ORM para usar el patrón DAO.
Dicho esto, aunque en realidad nunca necesita nada, debe usar DAO. El patrón se presta a código modularizado. Mantiene toda su lógica de persistencia en un solo lugar (separación de preocupaciones, lucha contra las abstracciones con fugas). Se permite probar el acceso a los datos por separado del resto de la aplicación. Y se permite probar el resto de la aplicación aislada del acceso a datos (es decir, puede burlarse de sus DAO).
Además, seguir el patrón DAO es fácil, incluso si implementar el acceso a los datos puede ser difícil. Entonces te cuesta muy poco (o nada) y ganas mucho.
EDITAR - Con respecto a su ejemplo, su método de inicio de sesión debe ser en algún tipo de servicio de autenticación. Puede manejar excepciones allí (en el método de inicio de sesión). Si usó Spring, podría administrar varias cosas para usted: (1) transacciones, (2) inyección de dependencia. No necesitaría escribir sus propias transacciones o fábricas dao, podría simplemente definir límites de transacciones en torno a sus métodos de servicio, y definir sus implementaciones DAO como beans y luego conectarlas a su servicio.
Edit2
La razón principal para usar el patrón es separar preocupaciones. Eso significa que todo su código de persistencia está en un solo lugar. Un efecto colateral de esto es la capacidad de prueba y mantenimiento, y el hecho de que esto hace que sea más fácil cambiar las implementaciones más tarde. Si está construyendo DAO basados en Hibernate, puede manipular absolutamente la sesión en el DAO, eso es lo que se supone que debe hacer. El patrón anti es cuando el código relacionado con la persistencia ocurre fuera de la capa de persistencia (ley de abstracciones con fugas).
Las transacciones son un poco más complicadas. A primera vista, las transacciones pueden parecer una preocupación de la persistencia, y lo son. Pero no son solo una preocupación de persistencia. Las transacciones también son una preocupación de sus servicios, ya que sus métodos de servicio deben definir una 'unidad de trabajo', lo que significa que todo lo que sucede en un método de servicio debe ser atómico. Si usa transacciones de hibernación, entonces tendrá que escribir el código de transacción de hibernación fuera de sus DAO, para definir límites de transacción en torno a los servicios que utilizan muchos métodos DAO.
Pero tenga en cuenta que las transacciones pueden ser independientes de su implementación: necesita transacciones ya sea que use hibernate o no. También tenga en cuenta que no necesita utilizar la maquinaria de transacción de hibernación: puede usar transacciones basadas en contenedores, transacciones de JTA, etc.
Sin duda, si no utiliza Spring o algo similar, las transacciones se llevarán a cabo ser un dolor Recomiendo utilizar Spring para administrar sus transacciones, o las especificaciones de EJB donde creo cree que puede definir transacciones alrededor de sus servicios con anotaciones.
Consulte los siguientes enlaces, para transacciones basadas en contenedores.
Container-Managed Transactions
Sessions And Transactions
Lo que estoy recogiendo de esto es que se puede definir fácilmente las transacciones fuera de los DAOs al nivel de servicio, y que no es necesario escribir ningún código de transacción.
Otra alternativa (menos elegante) es poner todas las unidades de trabajo atómicas dentro de los DAO. Podría tener DAO CRUD para las operaciones simples, y luego DAOs más complicados que realicen más de una operación CRUD. De esta forma, sus transacciones programáticas permanecen en el DAO, y sus servicios llamarían a los DAO más complicados y no tendrían que preocuparse por las transacciones.
El siguiente enlace es un buen ejemplo de cómo el patrón DAO puede ayudar a simplificar el código
AO vs ORM(hibernate) pattern
(Gracias @daff)
Aviso cómo la definición de la interfaz hace que sea para que su lógica comercial solo se preocupa por el comportamiento del UserDao. No le importa la implementación. Puede escribir un DAO usando hibernación, o solo JDBC. Entonces puede cambiar su implementación de acceso a datos sin afectar el resto de su programa.
posible duplicado de [Encontré JPA, o similar, no aliento el patrón DAO] (http://stackoverflow.com/questions/2100115/i-found-jpa-or-alike-dont-encourage-dao- patrón) – Bozho
Tal vez verifique mi publicación en el blog sobre eso. Propongo cómo combinar JPA con el patrón DAO de la manera más directa y SECA posible: http://codeblock.engio.net/?p=180 – bennidi