2014-08-16 19 views
31

Wszystko mogę zebrać od Google jest to, że:Co zawiera obiekt proxy Hibernuj?

  • Hibernate używa obiektu proxy wdrożyć leniwy załadunku. Gdy zażądamy załadowania obiektu z bazy danych, a pobrany obiekt odwołuje się do innego konkretnego obiektu, Hibernate zwraca proxy zamiast konkretnego powiązanego obiektu.

  • Hibernacja tworzy obiekt proxy za pomocą instrumentacji kodu bajtowego (udostępniany przez javassist). Hibernate tworzy podklasę naszej klasy encji w czasie wykonywania za pomocą biblioteki generowania kodu i zastępuje rzeczywisty obiekt nowo utworzonym proxy.

Co dokładnie zawiera obiekt Proxy?

Czy zawiera obiekt odniesienia szkieletu z ustawionym tylko polem identyfikatora? Inne pole zostanie ustawione, gdy nazwiemy metodę get?

Czy obiekt Proxy zawiera instrukcję JDBC, aby pobrać wszystkie dane wymagane do pełnego wypełnienia obiektu, do którego istnieje odwołanie.

Czy jest coś, czego może mi brakować?

Nie pytam o karmienie łyżeczką, ale jeśli potrafisz podać dowolny link z informacjami, które byłyby świetne.

Wszelkie poprawki do powyższego opisu również będą mile widziane.

Przykład.

class Address { 
    String city; 
    String country; 
} 

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

Kiedy staramy się załadować obiekt Person, Hibernate będzie podklasy klasy osoba jak:

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

i zwraca obiekt ProxyPerson. Obiekt ProxyPerson będzie miał wartość id i name, ale proxy dla adresu.

Czy mam rację?

Czego mogę oczekiwać od dodania metody toString() do obiektu proxy?

Odpowiedz

35

Jak wyjaśniono w mojej książce, High-Performance Java Persistence, serwer proxy w trybie hibernacji jest używany do zastępowania rzeczywistej jednostki POJO (Plain Old Java Object).

Klasa Proxy jest generowana w środowisku wykonawczym i rozszerza oryginalną klasę encji.

Hibernate używa obiektów Proxy dla encji, aby umożliwić lazy loading.

Podczas uzyskiwania dostępu do podstawowych właściwości serwera proxy, po prostu przekazuje połączenie do oryginalnego elementu.

Każdy List, Set, Map typu w klasie jednostki podstawiony przez PersistentList, PersistentSet, PersistentMap. Zajęcia te są odpowiedzialne za przechwycenie połączenia do niezainicjowanej kolekcji.

Serwer proxy nie wydaje żadnego komunikatu SQL.Wywołuje po prostu InitializeCollectionEvent, który jest obsługiwany przez skojarzony detektor, który wie, które zapytanie inicjacyjne należy wydać (zależy od skonfigurowanego planu pobierania).

+0

Dzięki Vlad, moje pytanie nie dotyczy kolekcji, ale odniesienia do innych klas. Zobacz teraz dodany przykład. – vineeshchauhan

+0

Tak, twoje założenia są poprawne. –

+1

Nadal nie rozumiem. – Spider