integracion ejemplo desde con cero aprender anotaciones java hibernate orm jpa

java - ejemplo - Hibernate/JPA: anotación de los métodos de bean frente a los campos



spring hibernate maven (5)

¿Por qué anotar los accesadores? Simplemente se ve sucio y es un dolor de mantener. Ahora tengo que buscar en toda la clase para saber cómo se aplica JPA o Hibernate. Cuando se trabaja con algunos plugins de generación de código de Hibernate para Eclipse, este es el predeterminado y me excita.

Sin mencionar que otra razón por la que usamos accesadores es agregar lógica al acceso a la propiedad o al padre de referencia u otro objeto que no se combina bien con dichas anotaciones.

Esta pregunta ya tiene una respuesta aquí:

Tengo una pregunta simple sobre el uso de Hibernate. Sigo viendo personas usando anotaciones JPA de una de dos maneras anotando los campos de una clase y también anotando el método get en los beans correspondientes.

Mi pregunta es la siguiente: ¿Hay alguna diferencia entre los campos de anotación y los métodos de bean con anotaciones de JPA como @Id.

ejemplo:

@Entity public class User { **@ID** private int id; public int getId(){ return this.id; } public void setId(int id){ this.id=id; } }

-----------O-----------

@Entity public class User { private int id; **@ID** public int getId(){ return this.id; } public void setId(int id){ this.id=id; } }


Hay varias discusiones disponibles que dan ventaja para usar FIELD sobre la propiedad (ver - http://java.dzone.com/tips/12-feb-jpa-20-why-accesstype ). Incluso Spring Framework también recomienda usar FIELD sobre la propiedad (ver - http://static.springsource.org/spring/docs/2.5.x/reference/orm.html ). Considero que FIELD tiene un enfoque más limpio, no solo porque no está obligado a implementar setters / getters, sino que también puede tener los setters / getters personalizados en su clase. Entonces una mejor encapsulación y clases más limpias. En cuanto a rendimiento, FIELD tiene un poco de ventaja sobre PROPERTY pero es insignificante.

EN UNA LÍNEA UTILIZA CAMPO sobre LA PROPIEDAD. Use PROPERTY si realmente lo necesita.


Mi recomendación es anotar los métodos. Al hacerlo, obtienes un poco de flexibilidad. Por ejemplo, digamos que tiene algunas clases:

  • AbstractEntity
  • StringIdEntity
  • AutoIdEntity

AbstractEntity define el campo id / getter / setter. Las clases StringIdEntity y AutoIdEntity heredan de AbstractEntity , pero usan diferentes estrategias @Id . Si anota el campo, no puede cambiarlo de clase a otra.

Si anota los métodos, marca getId() como @Transient/abstract en AbstractEntity y luego en las subclases, simplemente anula el método y aplica la estrategia que desea utilizar. Solía ​​anotar campos yo mismo y encontré esto y decidí que siempre anotaré los métodos que sigan adelante.

Por lo tanto, incluso si no ve los beneficios de anotar los métodos de inmediato, puede ser obvio en el futuro cuando tenga tantas clases que el cambio se convertirá en un dolor de cabeza absoluto.



Sí, si anota los campos, Hibernate utilizará el acceso de campo para establecer y obtener esos campos. Si anota los métodos, hibernate usará getters y setters. Hibernate elegirá el método de acceso basado en la ubicación de la anotación @Id y, que yo sepa, no puede mezclar ni combinar. Si anota un campo con @Id , las anotaciones sobre los métodos serán ignoradas y viceversa. También puede establecer manualmente el método con la anotación de nivel de clase @AccessType

La guía de referencia de Hibernate Annotations ha demostrado ser un recurso extremadamente útil para preguntas como esta y detalla cómo los tipos de acceso descienden en cascada jerarquías.