2012-01-22 12 views
12

Attualmente sto imparando Hibernate e Java Persistence API.javax.persistence Annotazioni sul campo, getter o setter?

Ho una classe @Entity e devo applicare annotazioni ai vari campi. Ho incluso nel codice qui sotto tutti e tre i posti dove potevano andare.

Devo applicarli al campo stesso, il getter o il setter? E qual è la differenza semantica, se esiste, tra queste tre opzioni.

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

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

+0

Le annotazioni sui setter non sono supportate perché è più difficile determinare il tipo di classe del campo utilizzando la riflessione per un setter. Per un getter, tutto ciò che devi fare è controllare il tipo di ritorno del metodo. Ma per un setter, cosa fai se passi più parametri ad esso? –

risposta

27

È necessario scegliere tra campo e getter. Le annotazioni sui setter non sono supportate. E tutte le annotazioni dovrebbero essere sui campi, o dovrebbero essere tutte su getter: non è possibile combinare entrambi gli approcci (eccetto se si utilizza l'annotazione @AccessType).

Per quanto riguarda preferenzialmente, la risposta è: dipende. Preferisco l'accesso al campo, ma YMMV, e ci sono situazioni in cui l'accesso alla proprietà è preferibile. Vedi Hibernate Annotations - Which is better, field or property access?.

+1

Scoperto anche che è possibile utilizzarlo per getId() senza recuperare l'intero oggetto http://stackoverflow.com/questions/2593722/hibernate-one-to-one-getid-without-fetching-entire-object/3238182# 3238182 –

+1

Da: http://java.dzone.com/articles/jpa-implementation-patterns-7 Caricamento lento in Hibernate - L'implementazione di caricamento lento di Hibernate inizializza sempre un proxy pigro quando viene richiamato qualsiasi metodo su quel proxy. L'unica eccezione a questo è il metodo annotato con l'annotazione @Id quando si utilizza l'accesso alle proprietà. Ma quando si utilizza l'accesso al campo non esiste un tale metodo e Hibernate inizializza il proxy anche quando richiama il metodo che restituisce l'identità dell'entità. –

2

bisogna mettere le annotazioni solo per il campo o solo per getter

@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; 
} 

E per tutti i campi/proprietà nello stesso modo. Tutte le annotazioni per i campi o tutte le annotazioni per getter