2009-06-02 10 views
31

Tengo una simple pregunta 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.Hibernate/JPA - anotación de métodos de bean frente a los campos

Mi pregunta es la siguiente: ¿Hay alguna diferencia entre anotar campos y 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; 
} 

} 

Respuesta

41

sí, si Anotar los campos , Hibernate usará 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 según 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

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

+0

@David - Sí, creo que es lo mismo para JPA. Sin embargo, JPA no es compatible con @AccessType –

+0

Una corrección, realmente puede mezclar el enfoque. Quiero decir que puedes tener una clase con AccessType.PROPERTY y AccessType.FIElD. Aunque no es recomendable, pero puedes hacerlo. –

+0

Gracias esta debería ser la respuesta aceptada. Especialmente la parte de mezclar y combinar. – cabaji99

2

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

  • AbstractEntity
  • StringIdEntity
  • AutoIdEntity

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

Si anotar los métodos, se marca como getId()@Transient/abstract en AbstractEntity y luego en las subclases, simplemente reemplaza el método y aplicar 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 los métodos de anotación inmediatamente, puede ser obvio en el futuro cuando tenga tantas clases que el cambio se convertirá en un dolor de cabeza absoluto.

3

¿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 utilizamos accesos es agregar lógica al acceso de propiedad o al padre de referencia u otro objeto que no se combina bien con dichas anotaciones.

+1

Puede modificar la ubicación de la anotación usando plantillas, aquí hay un tutorial detallado sobre cómo cambiar la ubicación de la anotación desde el acceso al campo: http://stackoverflow.com/questions/1861817/hibernate-moving-annotations-from-property-method- Nivel de campo a nivel – Grubhart

1

Hay varias discusiones disponibles que dan borde para usar FIELD sobre la propiedad (ver - http://java.dzone.com/tips/12-feb-jpa-20-why-accesstype). Incluso el marco de primavera 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. Así que 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 use CAMPO sobre PROPIEDAD. Use PROPERTY si realmente lo necesita.

Cuestiones relacionadas