Encontré JPA, o similar, no aliento el patrón DAO. No sé, pero me siento así, especialmente con los administradores de JTA administrados por el servidor.Encontré JPA, o similar, no aliento el patrón DAO
Después de un uso práctico adecuado con el patrón DAO, comencé a diseñar aplicaciones basadas en JPA alrededor de ese patrón. Pero no encaja, IMO. Tiendo a perder bastante las características de JPA y todo.
Bueno, supongamos que desencadena una consulta con bloqueo pesimista y devolvió una lista de entidades de un método DAO. Al regresar, la transacción finaliza y el bloqueo se va (un caso con el administrador de JTA administrado por el servidor). Entonces, no tiene sentido, en términos generales. Sin embargo, hay casos válidos.
Otro ejemplo es mucho más trivial. Supongamos que activa una consulta para obtener alguna entidad, que tiene una asociación de carga lenta de uno a muchos con alguna otra entidad. Al devolver el método DAO, la transacción finaliza. La carga lenta no funcionaría más, simplemente obtienes null
o algo así. Para hacer frente a eso, lo cargamos ansiosamente de forma manual. hacemos algo como a.getBList().size()
.
Por lo tanto, IMO es mejor no hacer un DAO exclusivamente, y hacerlo en su negocio de frijol, de esta manera usted podrá aprovechar esas características útiles. O la API de ORM se puede considerar DAO/Data-layer en sí misma, podría decirse. Entonces, no necesitamos hacer otro.
¿Qué piensan ustedes al respecto?
Nota: No digo, de ninguna manera, que el patrón DAO esté obsoleto. De hecho, depende del caso.
(+1) Tiendo a aceptar que si uno no tiene nada en particular en mente, no hay una razón para crear una capa dao.Incluso un DAO genérico, y mucho menos una clase DAO separada para la entidad. – Bozho
He estado luchando para encontrar una buena forma de probar mi código Java EE JAX-RS/JPA, y ha sido una pesadilla intentar obtener una solución viable de "contenedor en las pruebas". El aspecto principal es intentar inyectar un @ Context PersistenceContext de las pruebas. Estoy pensando que usar @ EJB Dao junto con un constructor llamado desde pruebas y establecer el Dao estará limpio. –