sirve que patron para ejemplos diseño java hibernate design-patterns entity data-transfer-objects

java - que - ¿Cuál es un buen patrón para convertir entre entidades de hibernación y objetos de transferencia de datos?



patron dto vo (5)

He tenido preguntas e inquietudes similares sobre cómo convertir entre entidades de Hibernate y objetos de transferencia de datos a ser devueltos por un servicio web, tal como se analiza en esta pregunta:

Está utilizando objetos de transferencia de datos en ejb3 considerado la mejor práctica

Uno de los factores mencionados aquí es que 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 sólido.

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

Por lo tanto, suponiendo que ambos implementen el siguiente ''Libro'', necesitaría convertir un BookEntity.class en un BookDTO.class para que JAXB pueda serializar y devolver.

Una vez más, todo este prospecto me parece dudoso, pero si hay buenos patrones para ayudar a lidiar con esta conversión, me encantaría tener una idea.

¿Hay quizás 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 las entidades?


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

Mi preferencia suele ser "sí". No me gusta la idea de jerarquías paralelas creadas solo por razones de arquitectura o pureza de capas.

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

Otra razón que se suele dar 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 nada más que transmitir datos a la capa de vista.

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 no estarían de acuerdo. Simplemente estoy ofreciendo mi opinión. No es la única forma de hacerlo, ni necesariamente la forma "correcta". Es mi preferencia.


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 las formas 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, generando excepciones. Por lo tanto, o bien deben desalojarse (separarse) del administrador de la entidad o deben convertirse a DTO apropiados. A menos que haya una respuesta, hay un patrón, del cual no tengo conocimiento, que me gustaría mucho saber.


Para crear rápidamente un DTO "similar", sin un montón de códigos get / set duplicados, puede usar BeanUtils.copyProperties . Esa función le ayuda a copiar rápidamente los datos de la clase DAO a DTO. Solo recuerde que hay más de una biblioteca común compatible con BeanUtils.copyProperties, pero su sintaxis no es la misma.


Sé que esta es una pregunta antigua, pero pensé que agregaría 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 JPA. Nuestro equipo estaba debatiendo la mejor manera de mover datos entre los dos objetos (en realidad estructuras de datos).

Aquí hay una opción para que la gente considere:

Encontramos y estamos experimentando con Dozer que maneja (1) el mismo nombre, (2) la asignación XML y (3) las conversiones personalizadas como formas de copiar datos entre dos POJO.

Ha sido muy fácil de usar hasta ahora.


Tiene que haber una opinión 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 millones de anotaciones a sus clases de dominio.

Empiezas con @Entity. No es tan malo. Pero luego necesita JAXB para agregar @XMLElement, etc. - y luego necesita JSON para agregar cosas como @JsonManagedReference para que Jackson haga lo correcto con las relaciones, luego agregue, etc., etc. hasta el infinito.

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

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