2012-09-10 15 views
11

Questa domanda è essenzialmente l'opposto di this one.Come rendere Hibernate ignorato un metodo?

Ho un metodo in questo modo:

public boolean isVacant() { 
    return getEmployeeNum() != null && getEmployeeNum().equals("00000000"); 
} 

Quando carico in su, Hibernate si lamenta che ho attributo chiamato vacant. Ma non voglio un attributo chiamato vacant - Non ho bisogno di memorizzare quei dati - è semplicemente logico.

Hibernate dice:

org.hibernate.PropertyNotFoundException: Impossibile trovare un setter per la proprietà vacante in classe com.mycomp.myclass ...

C'è un'annotazione posso aggiungere al mio metodo isVacant() per far sì che Hibernate lo ignori?

risposta

25

Aggiungere @Transient al metodo, quindi Hibernate deve ignorarlo.

Per citare il Hibernate Documentation:

Ogni proprietà non statica non transitoria (campo o il metodo in base al tipo di accesso) di un'entità è considerata persistente, a meno che non annotare come @Transient.

+0

Doh - Ho pensato che "@ Transient" era solo per i campi ... – corsiKa

3

RNJ è corretto, ma potrei aggiungere il motivo per cui questo accade:

Sto indovinando che avete annotato i getter della vostra classe persistente. I prefissi usati dai java bean sono "set" e "get", che sono usati per leggere e scrivere sulle variabili, ma c'è anche il prefisso "is", che viene usato per i valori booleani (invece di "get"). Quando Hibernate vede la tua classe persistente con annotazione getter e trova un metodo "isVacant", presuppone che esista una proprietà "vacante" e presuppone che esista anche un metodo "set".

Quindi, per risolvere il problema, è possibile aggiungere l'annotazione @Transient oppure è possibile modificare il nome del metodo in qualcosa che non inizia con "è". Non penso che questo sarebbe un problema se la tua classe fosse annotata sui campi, invece dei metodi get.

+3

Il problema con la ridenominazione del metodo, tuttavia, è che anche questo rompe la convenzione. Per convenzione, i metodi che restituiscono i booleani (indipendentemente dal fatto che siano o meno membri) iniziano con is o has. Si consideri il metodo 'java.util.Collection'' isEmpty() '- la maggior parte delle Collezioni non memorizza se sono vuote o meno - confrontano le loro dimensioni con 0. (Questo non è vero per tutte le collezioni, ad esempio' ConcurrentLinkedQueue' ma lo è per la maggior parte, al punto che 'AbstractCollection' lo implementa come tale.) – corsiKa

Problemi correlati