2009-11-30 11 views
12

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.¿Las clases de dominio generalmente obtienen anotaciones JPA o JAXB o ambas?

Actualmente la aplicación utiliza DTO en el lado de persistencia y anota las clases de dominio con anotaciones JAXB. Sin embargo, cuanto más leo y pienso en él, ¡más parece al revés! (Sin mencionar que hay un montón de código para soportar el ir y venir 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 por cable.

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

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

Respuesta

11

No existe un motivo 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, se requieren intercambios de diseño de clase diferentes con JAXB y JPA. En mi experiencia, estas concesiones generalmente significan que terminas con dos modelos de clase.

+2

Tiene sentido que, tarde o temprano, tendrá que separarlos en capas. Pero en un proyecto completamente nuevo, se ahorra mucho tiempo para combinarlos. Es bueno saber que no hay malos efectos secundarios de hacer esto. – HDave

+10

Y aquí vuelvo a estar dos años desglosándolos porque nuestra aplicación web cliente solo quiere consumir los datos que necesita, por lo que estamos haciendo DTO (con anotaciones JAX-B) que están separados de nuestras entidades de dominio (JPA). – HDave

2

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

5

Acepto que el uso de las mismas clases de modelo es el enfoque correcto.Si usted está preocupado por el desorden de anotación, se puede utilizar una aplicación JAXB (como EclipseLink JAXB) que proporciona un mecanismo para la externalización de los metadatos:

también dado que está utilizando un modelo de APP EclipseLink JAXB (moxy) tiene extensiones para hacer esto más fácil:

Aquí se muestra un ejemplo de la utilización de un modelo con JAXB & JPA para crear un servicio RESTful:

1

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

+0

Acepto que el enlace Atom (y sus anotaciones JAX-B) no pertenecen a un módulo de dominio. Sin embargo, aún puede tener sentido colocar anotaciones JAX-B en las clases de dominio que tiene allí. Dicho esto, también utilizo los archivos de mapeo XML JAX-B a través de MOXy que me parecen muy convenientes, además de que uno puede proporcionar diferentes asignaciones para diferentes puntos finales. – HDave

1

Sé que esta pregunta es un poco vieja, pero pensé que iba a pesar de todos modos ya que este es un problema que he encontrado recientemente. Mi recomendación sería dejar las clases anotadas de JAXB, ya que cualquier cambio de esquema requerirá volver a generar estas clases. Lo que significa que tendrá que volver a introducir cualquier anotación de hibernación, etc. manualmente. Esta puede ser una solución un poco obsoleta, pero creo que sería perfectamente razonable crear un archivo de mapeo de hibernación (.hbm.xml) para alojar las asignaciones externamente. Esto es un poco más flexible, menos desordenado y tan útil en mi opinión.

+0

"Lo que significa que tendrá que volver a introducir cualquier anotación de hibernación, etc. manualmente". - Ver Hyperjaxb3, este complemento crea anotaciones JPA atumatically. http://confluence.highsource.org/display/HJ3/Home Descargo de responsabilidad: soy el autor. – lexicore

+0

Mis pensamientos, un año después: las posibilidades de que una clase coincida perfectamente con las anotaciones JPA y JAXB son bastante escasas. Recomiendo dividirlos en archivos separados el 99% del tiempo. –

Cuestiones relacionadas