2009-06-02 8 views
31

Ho una semplice domanda sull'utilizzo di Hibernate. Continuo a vedere le persone che usano annotazioni JPA in uno dei due modi annotando i campi di una classe e anche annotando il metodo get sui bean corrispondenti.Hibernate/JPA - metodi di annotazione dei bean vs campi

La mia domanda è la seguente: C'è una differenza tra l'annotazione di campi e metodi di bean con gli annunci JPA come @Id.

esempio:

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

} 

risposta

41

Sì, se si annotare i campi , Hibernate utilizzerà l'accesso al campo per impostare e ottenere quei campi. Se annoti i metodi, l'ibernazione utilizzerà getter e setter. Hibernate sceglierà il metodo di accesso in base alla posizione dell'annotazione @Id e, a mia conoscenza, non è possibile combinare. Se annoti un campo con @Id, le annotazioni sui metodi verranno ignorate e viceversa. Puoi anche impostare manualmente il metodo con l'annotazione a livello di classe @AccessType

Il Hibernate Annotations reference guide ha dimostrato di essere una risorsa estremamente utile per domande come questa e spiega in dettaglio come i tipi di accesso si sovrappongono alle gerarchie.

+0

@David - Sì, credo che sia lo stesso per JPA. Tuttavia, JPA non supporta @AccessType –

+0

Una correzione, puoi effettivamente mescolare l'approccio. Voglio dire che puoi avere una classe con AccessType.PROPERTY e AccessType.FIElD. Anche se non è raccomandato ma puoi farlo. –

+0

Grazie questa dovrebbe essere la risposta accettata. Specialmente la parte mix and match. – cabaji99

2

La mia raccomandazione è di annotare i metodi. Facendo così, guadagni un po 'di flessibilità. Per esempio, supponiamo di avere un paio di classi:

  • AbstractEntity
  • StringIdEntity
  • AutoIdEntity

AbstractEntity definisce l'id campo/getter/setter. Le classi StringIdEntity e AutoIdEntity ereditano da AbstractEntity, ma utilizzano diverse strategie @Id. Se annoti il ​​campo, non puoi cambiarlo da una classe all'altra.

Se annotare i metodi, si contrassegna come getId()@Transient/abstract in AbstractEntity e poi nelle sottoclassi, è sufficiente l'override del metodo e applicare la strategia che si desidera utilizzare. Ho annotato personalmente i campi e mi sono imbattuto in questo e ho deciso di annotare sempre i metodi che vanno avanti.

Quindi, anche se non si vedono immediatamente i vantaggi dei metodi di annotazione, potrebbe diventare ovvio quando ci sono così tante classi che il passaggio diventerà un vero problema.

3

Perché dovresti annotare gli accessori? Sembra semplicemente disordinato ed è un dolore da mantenere. Ora devo cacciare tutta la classe per scoprire come viene applicato JPA o Hibernate. Quando si lavora con alcuni plugin di generazione del codice di Hibernate per Eclipse questo è l'impostazione predefinita e mi fa impazzire.

Per non parlare del fatto che un altro motivo per cui utilizziamo i metodi di accesso consiste nell'aggiungere la logica all'accesso della proprietà o al riferimento genitore o altro oggetto che non combina bene con le suddette annotazioni.

+1

È possibile modificare la posizione dell'annotazione utilizzando i modelli, ecco un tutorial dettagliato su come modificare la posizione dell'annotazione dall'accessorio al campo: http://stackoverflow.com/questions/1861817/hibernate-moving-annotations-from-property-method- livello-to-a livello di campo – Grubhart

1

Ci sono diverse discussioni disponibili che danno margine per usare CAMPO su proprietà (vedi - http://java.dzone.com/tips/12-feb-jpa-20-why-accesstype). Anche la struttura di primavera raccomanda anche l'uso di CAMPO su proprietà (vedi - http://static.springsource.org/spring/docs/2.5.x/reference/orm.html). Trovo il CAMPO un approccio più pulito non solo perché non sei obbligato a implementare setter/getter, ma puoi avere i tuoi setter/getter personalizzati nella tua classe. Quindi un incapsulamento migliore e classi più pulite. Performance Wise FIELD ha un po 'di vantaggio su PROPERTY ma è trascurabile.

IN UNA LINEA utilizzare CAMPO su PROPERTY. Usa PROPRIETÀ se ne hai davvero bisogno.

Problemi correlati