Sto cercando di capire qual è la differenza in oggetto restituito e comportamento di Hibernate 3.6 session.get()
e session.load()
.Hibernate 3.6 - session.get() vs session.load()
Dal javadoc:
get():
Ritorna l'istanza persistente data classe di entità con la dato identificativo, o null se non esiste un'istanza persistente. (Se l'istanza è già associato con la sessione, tornare che esempio Questo metodo non restituisce un'istanza non inizializzata..)
load():
Ritorna l'istanza persistente data classe di entità con l'identificatore dato , supponendo che l'istanza esista. Questo metodo potrebbe restituire un'istanza con proxy che è inizializzata su richiesta, quando si accede a un metodo non identifier .
Ho tre domande:
Javadoc non dice quando
load()
potrebbe restituire un proxy - non v'è alcun modo di sapere in anticipo?Quando
load()
restituisce un proxy - ciò significa cheload()
non ha accesso al database, sono corretto? Allora cosa succede se ho fornitoload()
con un identificatore che non esiste nel database? Ora avrò nella sessione un proxy con un ID non valido (senza ottenere un'eccezione). Ora voglio lasciare che un'altra istanza persistente punti a quel proxy: funzionerà? Per questo scenario non ho bisogno di inizializzare il proxy, ho solo bisogno del suo id (che ho anche se non è valido poiché non è nel database). Quindi suppongo che sto chiedendo se la mia descrizione è corretta, e ho sempre bisogno di controllare dopoload()
l'oggetto restituito conisInitialized()
per assicurarsi che rappresenti un'entità valida (o almeno un proxy valido), cioè con un valido ID.Inoltre, cosa succede se
load()
restituisce un proxy, quindi il proxy è l'istanza che è già associata alla sessione. Quindi, in base alla descrizione diget()
: "Se l'istanza è già associata alla sessione, restituire tale istanza." -get()
restituisce il proxy? Poiché in base alla descrizione diget()
: "Questo metodo non restituisce mai un'istanza non inizializzata."
Grazie!
UPDATE
sono le seguenti corretta?
(A) Penso che sia load()
e get()
proverà prima a controllare la cache di sessione prima di andare al DB - quindi non sarebbe corretto dire che qualcuno di loro colpisce sempre il DB, o restituisce sempre un proxy.
(B) Un proxy inizializzato non è lo stesso che l'istanza originale, come potete leggere qui: http://blog.xebia.com/2008/03/08/advanced-hibernate-proxy-pitfalls/
1.Ma se avessi già un'istanza inizializzata (per questo ID) sulla sessione, non restituirebbe quell'istanza e non un proxy? Inoltre, javadoc dice: "Questo metodo potrebbe restituire un'istanza con proxy" - non dice "questo metodo sarà sempre". 2. È una sorta di difetto di progettazione - poiché in base a ciò che dici quando ho un proxy e voglio assicurarmi che rappresenti un ID effettivo in DB (e voglio sempre renderlo sicuro - anche se utilizzo solo il proxy per puntare ad altre istanze ad esso) - quindi non posso sapere che l'ID che ho usato è valido fino a quando non lo inizializzo, ma in questo caso, perché usare un proxy? – rapt
3. Intendi un 'get()' dopo 'load()' restituirà un proxy inizializzato, o solo un'istanza inizializzata? Dal momento che se è il più tardi, ora abbiamo nella sessione due oggetti che contengono lo stesso ID (il proxy e l'istanza). A proposito, so che è possibile avere due proxy che rappresentano lo stesso ID DB, come potete leggere qui: http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/ sotto il testo " In secondo luogo, è possibile rompere il proxy ". - Vedi di più in UPDATE nella mia domanda originale. – rapt
Sì. Hai ragione. Le tue domande mi aiutano a chiarire qualche malinteso su 'get()' e 'load()'. Guarda il mio aggiornamento per favore –