Pregunta

Tengo una aplicación empresarial Java que proporciona un servicio web, tiene una capa de dominio y una capa de persistencia de hibernación. En este caso particular, no hay una gran diferencia (por el momento) entre los objetos que envío por cable, los objetos de dominio y los objetos de persistencia.

Actualmente, la aplicación utiliza DTO en el lado de la persistencia y anota las clases de dominio con anotaciones JAXB. Sin embargo, cuanto más lo leo y pienso en ello, ¡más parece esto al revés! (Sin mencionar que hay mucho código para soportar el ir y venir sin sentido entre los DTO y los objetos de Dominio). Parece que la mayoría de los arquitectos sugieren poner anotaciones JPA en el modelo de dominio y crear DTO para enviar objetos a través del cable.

En mi caso, ¿podría poner las anotaciones JAXB y JPA (Hibernate) en mis clases de dominio?

La idea de mantener mi fachada de servicio web, mi dominio y mi persistencia todos juntos parece fácil de mantener, pero me preocupa, ya que estos pueden necesitar cambiar a tiempo. ¿Pero sería más inteligente crear un conjunto de clases DTO para el lado de los servicios web y omitir los DTO para el lado de la persistencia?

¿Fue útil?

Solución

No hay ninguna razón funcional para no anotar la misma clase con las anotaciones JPA y JAXB, lo he hecho yo mismo en ocasiones. Sin embargo, se vuelve un poco difícil de leer y, a veces, desea compensaciones de diseño de clase diferentes con JAXB y JPA. En mi experiencia, estas compensaciones generalmente significan que terminas con dos modelos de clase.

Otros consejos

Estoy de acuerdo en que usar las mismas clases de modelo es el enfoque correcto. Si le preocupa el desorden de anotaciones, puede usar una implementación JAXB (como EclipseLink JAXB ) que proporciona un mecanismo para externalizar los metadatos:

Además, dado que está utilizando un modelo JPA, EclipseLink JAXB (MOXy) tiene extensiones para facilitar esto:

Aquí hay un ejemplo del uso de un modelo con JAXB & amp; JPA para crear un servicio RESTful:

No hay problema al usar ambas anotaciones en la misma clase. Incluso tiendo a alentar esto, porque así no tienes que copiar y pegar cuando se producen cambios. En algunos casos, algunas propiedades difieren en el comportamiento; por ejemplo, es posible que no se requiera que se identifique una ID generada automáticamente. @XmlTransient y @Transient se combinan. Se vuelve un poco difícil de leer, pero no demasiado difícil, porque es obvio lo que significan todas las anotaciones.

¿Alguien está tentado a poner objetos de enlace de átomo en su dominio persistente porque se ha comprometido a definir la estructura xml de su servicio web allí? Me parece extraño hacer esto. Los enlaces de Hateoas parecen una buena idea, pero el dominio persistente y el servicio impl (no el servicio web) no tienen interés en los enlaces atómicos. Por otra parte, usar anotaciones xml y hacer que Jersey serialice mi dominio para mí ciertamente es conveniente. Sin embargo, otra desventaja de este enfoque es que es fácil impactar a los consumidores de sus servicios web en tiempo de ejecución con el dominio de persistencia '' capa '' refactorización.

Sé que esta pregunta es un poco vieja, pero pensé en considerarla de todos modos ya que este es un problema que me he encontrado recientemente. Mi recomendación sería dejar sus clases anotadas JAXB solo, ya que cualquier cambio de esquema requerirá volver a generar estas clases. Lo que significa que tendrá que volver a ingresar las anotaciones de hibernación, etc. manualmente. Esta puede ser una solución un poco desactualizada, pero creo que sería perfectamente razonable crear un archivo de mapeo de hibernación (.hbm.xml) para albergar los mapeos externamente. Esto es un poco más flexible, menos desordenado e igual de útil en mi opinión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top