lunedì 15 novembre 2010

Hibernate: differenza tra get e load

Il metodo get() sollecita immediatamente il database. Cio significa che, non appena avviene la chiamata la get(), Hibernate genera un'istruzione SQL per il database, nel tentativo di recuperare i dati (di solito una riga nel database) per ricostruire l'oggetto persistente richiesto.

Una chiamata load(), invece, non comporta una chiamata immediata al database. Il metodo load() implica la costruzione di un oggetto proxy che rapprensenta l'oggetto persistente. Solo dopo qualche passaggio l'oggetto proxy sollecita la generazione dell'istruzione SQL appropriata per il database e Hibernate costruisce il vero oggetto persistente.

Quando si usa get(), il metodo restituisce null se non viene trovato il dato richiesto.
Poiché il metodo load() non recupera immediatamente l'oggetto, se non viene trovato il dato viene generata una ObjectNotFoundException.
Quindi, se non si è sicuri dell'esistenza dell'oggetto, è preferibile usare la get().

3 commenti:

  1. Infatti il javadoc del metodo load dice:

    You should not use this method to determine if an instance exists (use get() instead). Use this only to retrieve an instance that you assume exists, where non-existence would be an actual error.

    RispondiElimina
  2. Propongo la lettura di questo link dove si possono apprezzare i vantaggi di usare load() invece che get()

    http://gmarwaha.blogspot.com/2007/01/hibernate-difference-between-sessions.html

    E' piu elegante usare load() quando e' possibile trovare l'oggetto in sessione perche non viene fatto alcuno statement aggiuntivo a carico del db.

    RispondiElimina
  3. Sia il metodo get() che il metodo load() verificano prima la presenza dell'oggetto nella cache di sessione
    e restituiscono questo nelo caso in cui sia presente.
    Riporto dalla documentaizone del metodo get:

    Return the persistent instance of the given entity class with the given identifier, or null if there is no such persistent instance. (If the instance is already associated with the session, return that instance. This method never returns an uninitialized instance.)

    Vedere il javadoc di org.hibernate.Session

    Per ulteriori dettagli vedere anche su StackOverflow Hibernate: Difference between session.get and session.load

    RispondiElimina