2014-08-16 11 views
31

Tutto quello che ho potuto raccogliere da Google è che:Che cosa contiene l'oggetto proxy Hibernate?

  • Hibernate utilizza un oggetto proxy per implementare lazy loading. Quando chiediamo di caricare l'oggetto dal database e l'oggetto recuperato ha un riferimento a un altro oggetto concreto, Hibernate restituisce un proxy anziché l'oggetto associato concreto.

  • Hibernate crea un oggetto proxy utilizzando la strumentazione bytecode (fornita da javassist). Hibernate crea una sottoclasse della nostra classe di entità in fase di esecuzione utilizzando la libreria di generazione del codice e sostituisce l'oggetto reale con il proxy appena creato.

Quindi, che cosa contiene esattamente l'oggetto Proxy?

Contiene un oggetto di riferimento oggetto scheletro con solo il campo ID impostato? Gli altri campi verranno impostati quando chiamiamo il metodo get?

L'oggetto Proxy contiene l'istruzione JDBC per recuperare tutti i dati richiesti per riempire completamente l'oggetto di riferimento.

C'è qualcos'altro che potrebbe mancare?

Non sto chiedendo l'alimentazione del cucchiaio ma se è possibile fornire qualsiasi collegamento con informazioni che sarebbe bello.

Qualsiasi correzione alla descrizione sopra sarà anche benvenuta.

Esempio.

class Address { 
    String city; 
    String country; 
} 

class Person{ 
    int id; 
    String name; 
    Address address; 
}  

Quando si prova a caricare l'oggetto Person, Hibernate sottoclasse classe Persona come:

class ProxyPerson extends Person { 
     int id; 
     String name; 
     Address proxyCGLIBObject; 
} 

e restituire un oggetto ProxyPerson. Oggetto di ProxyPerson avrà un valore per ID e nome ma proxy per Indirizzo.

Sono corretto?

Cosa posso aspettarmi dall'aggiunta di un metodo toString() sull'oggetto proxy?

risposta

35

Come spiegato nel mio libro, High-Performance Java Persistence, il proxy di ibernazione viene utilizzato per sostituire un'entità reale POJO (Plain Old Java Object).

La classe Proxy viene generata in fase di esecuzione e estende la classe di entità originale.

Hibernate utilizza oggetti proxy per entità consente di consentire lazy loading.

Quando si accede alle proprietà di base sul Proxy, si limita a delegare la chiamata all'entità originale.

Ogni List, Set, Map tipo nella classe entità è sostituito da un PersistentList, PersistentSet, PersistentMap. Queste classi sono responsabili dell'intercettazione di una chiamata a una raccolta non inizializzata.

Il proxy non rilascia alcuna istruzione SQL.Semplicemente innesca uno InitializeCollectionEvent, che viene gestito dal listener associato, che conosce la query di inizializzazione da emettere (dipende dal piano fetch configurato).

+0

Grazie Vlad, la mia domanda non è per la raccolta ma il riferimento ad altre classi. Si prega di vedere l'esempio aggiunto ora. – vineeshchauhan

+0

Sì, le tue supposizioni sono corrette. –

+1

Ancora non capisco. – Spider

Problemi correlati