2010-12-29 12 views
20

he tenido preguntas y preocupaciones similares en cuanto a cómo convertir entre entidades de Hibernate y transferencia de datos de objetos para ser devuelto por un servicio web como se discuten en esta pregunta:¿cuál es un buen patrón para convertir entidades de hibernación y objetos de transferencia de datos?

Is using data transfer objects in ejb3 considered best practice

Uno de los factores mencionados aquí si el modelo de dominio cambia, un conjunto de DTO protegerá a los consumidores en el caso de un servicio web.

Aunque parece que agregará una cantidad sustancial de código a mi proyecto, este razonamiento parece correcto.

¿Existe un buen patrón de diseño que pueda usarse para convertir una entidad de Hibernate (que implementa una interfaz) a una DTO que implementa la misma interfaz?

Suponiendo que ambos implementen 'Libro', necesitaría convertir un BookEntity.class en una clase BookDTO.class para que yo pueda dejar que JAXB serialice y devuelva.

Una vez más, todo este prospecto me parece dudoso, pero si hay buenos patrones para ayudar con esta conversión, me gustaría obtener alguna información.

¿Hay alguna forma interesante de convertir a través de la reflexión? O un patrón de 'constructor' en el que no estoy pensando?

¿Debo ignorar el patrón DTO y pasar entidades?

+0

Demasiadas quejas sobre la pregunta, pero no hay respuestas reales :(... Estoy teniendo dificultades con Hibernate (me llamaría cinturón blanco sobre este tema), ya que no puedo usar los objetos devueltos por el marco fuera de la sesión de hbm. Llegué a esta página buscando el patrón correcto, y no encontré ninguna respuesta ... – Cotta

Respuesta

16

¿Debo simplemente ignorar el patrón DTO y pasar entidades?

Mi preferencia suele ser "sí". No me gusta la idea de jerarquías paralelas creadas solo por el bien de la pureza arquitectónica o de capa.

El motivo original para el patrón DTO fue el exceso de conversaciones en las aplicaciones EJB 1.0 y 2.0 al pasar los EJB de entidad al nivel de vista. La solución fue poner el estado de bean de la entidad en un DTO.

Otra razón que generalmente se da para crear DTO es prohibir la modificación por la capa de vista. Los DTO son objetos inmutables en ese caso, sin comportamiento. No hacen más que transportar datos a la capa de visualización.

Yo diría que DTO es un patrón Core J2EE que se ha convertido en un antipatrón.

Me doy cuenta de que algunas personas estarían en desacuerdo. Simplemente estoy ofreciendo mi opinión. No es la única forma de hacerlo, ni necesariamente el camino "correcto". Es mi preferencia.

+1

En general, también me niego a implementar DTO, no lo suficiente por el dinero. Implemento las clases de DAO y uso las herramientas de Hibernate para generar/hacer ingeniería inversa con las clases modelo de la base de datos. Eso es bueno. –

+1

Mi esperanza original al publicar la pregunta era que había alguna forma interesante o perspicaz de convertir entre entidades y dto que comparten una interfaz que no había encontrado antes. Pero he estado convencido de que realmente no debería molestarme en agregar esa complejidad a mis servicios solo para mantener una separación entre capas. madejas! –

+3

Creo que si tienes control total sobre la pila completa, entonces sí, esto es válido. Sin embargo, tener dos o más UI's usando su servicio y no separar las capas es peligroso. Si va y realiza un cambio en el objeto que está enviando, interrumpirá sus llamadas a su servicio. No puede esperar que todos los implementadores de su servicio actualicen su código al cambiar su capa. Por lo tanto, la razón principal para la separación de capas, pero cada contexto es diferente. Tienes que entender eso primero. – avanderw

14

Tiene que haber una vista contraria entre todas las alegres patadas del DTO.

tl; dr - A veces sigue siendo útil.

La ventaja del DTO es que no tiene que agregar un trillón de anotaciones a sus clases de dominio.

Empiezas con @Entity. No es tan malo. Pero entonces necesitas JAXB, entonces agregas @XMLElement, etc., y luego necesitas JSON para que agregues cosas como @JsonManagedReference para que Jackson haga lo correcto con las relaciones, luego se agrega etc., etc., hasta el infinito.

Muy pronto su POJO ya no es tan sencillo. Lea sobre el "diseño impulsado por el dominio" en algún momento.

Además, puede "filtrar" algunas propiedades que no desea que la vista conozca.

5

No debemos olvidar que los objetos de entidad no son fáciles de manejar cuando están en estado administrado. Esto hace que su paso a formas de GUI sea problemático. Para ser más precisos, los objetos secundarios se manejan con entusiasmo. Esto no se puede hacer fuera de sesión, codificando excepciones. Entonces, tienen que ser desalojados (desconectados) del administrador de la entidad o deben ser convertidos a DTO apropiados. A menos que haya una fuente, hay un patrón, que no conozco, que estaría muy contento de saber.

4

Para crear rápidamente una DTO "parecida", sin un montón de código duplicado para obtener/configurar, puede usar BeanUtils.copyProperties. Esa función lo ayuda a copiar rápidamente los datos de la clase DAO a DTO. Solo recuerde que hay más de una biblioteca común que admite BeanUtils.copyProperties, pero su sintaxis no es la misma.

+0

Biblioteca muy útil. – OJVM

2

Sé que esta es una pregunta antigua, pero pensé que podría agregar una respuesta que ofrezca un marco para ayudar en caso de que alguien más esté abordando este problema.

Nuestro proyecto tiene POJO anotados JAXB que están separados de los POJO anotados por JPA. Nuestro equipo estaba debatiendo sobre la mejor manera de mover datos entre los dos objetos (en realidad estructuras de datos).

Aquí es una opción para las personas a considerar:

que encontramos y están experimentando con Dozer que maneja (1) mismo nombre, (2) el mapeo XML y (3) las conversiones personalizadas como formas de copiar datos entre dos POJOs.

Ha sido muy fácil de usar hasta ahora.

Cuestiones relacionadas