2012-01-22 14 views
12

Actualmente estoy aprendiendo Hibernate y la API Java Persistence.javax.persistence Anotaciones en campo, getter o setter?

Tengo una clase @Entity, y necesito aplicar anotaciones a los diversos campos. He incluido en el código debajo de los tres lugares donde podrían ir.

¿Debo aplicarlos al campo en sí, el captador o el colocador? Y cuál es la diferencia semántica, si la hay, entre estas tres opciones.

import javax.persistence.Entity; 
import javax.persistence.Table; 
import javax.persistence.Id; 

@Entity 
@Table(name = "song") 
public class Song { 
    // Annotations should only be applied to one of the below 

    @Id 
    @Column(name="id", unique=true, nullable=false) 
    private int id; 

    @Id 
    @Column(name="id", unique=true, nullable=false) 
    public int getId() { 
     return id; 
    } 

    @Id 
    @Column(name="id", unique=true, nullable=false) 
    public void setId(int id) { 
     this.id = id; 
    } 
} 
+0

Posible duplicado http://stackoverflow.com/questions/4188048/why-should-anybody-put-annotations-on-the-getters-or-setters-when-using- jpa-to-m –

+0

Las anotaciones en los setters no son compatibles porque es más difícil determinar el tipo de clase del campo utilizando la reflexión para un setter. Para un getter, todo lo que tiene que hacer es verificar el tipo de devolución del método. Pero para un colocador, ¿qué haces si le pasas múltiples parámetros? –

Respuesta

27

Debes elegir entre campo y obtención. Las anotaciones en setters no son compatibles. Y todas las anotaciones deben estar en campos, o todas deberían estar en getters: no puede mezclar ambos enfoques (excepto si usa la anotación @AccessType).

En cuanto a cuál es el preferrale, la respuesta es: depende. Prefiero el acceso de campo, pero YMMV, y hay situaciones donde el acceso a la propiedad es preferible. Ver Hibernate Annotations - Which is better, field or property access?.

+1

También descubrió que puede usarlo para getId() sin recuperar todo el objeto http://stackoverflow.com/questions/2593722/hibernate-one-to-one-getid-without-fetching-entire-object/3238182# 3238182 –

+1

De: http://java.dzone.com/articles/jpa-implementation-patterns-7 Carga diferida en Hibernate: la implementación de carga diferida de Hibernate siempre inicializa un proxy diferido cuando se invoca cualquier método en ese proxy. La única excepción a esto es el método anotado con la anotación @Id cuando utiliza el acceso a la propiedad. Pero cuando utiliza el acceso de campo no existe dicho método e Hibernate inicializa el proxy incluso cuando invoca el método que devuelve la identidad de la entidad. –

2

usted tiene que poner anotaciones sólo para campo o sólo para captador

@Id 
@Column(name="id", unique=true, nullable=false) 
private int id; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

o

private int id; 

@Id 
@Column(name="id", unique=true, nullable=false) 
public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

Y para todos los campos/propiedades de la misma manera. Todas las anotaciones para campos o todas las anotaciones para getter

Cuestiones relacionadas