2012-06-17 10 views

Odpowiedz

5

Leniwy ładunek działa w ten sposób, że Hibernate używa struktur, które mogą być prokurowane, aby wiedzieć, kiedy próbujesz uzyskać dostęp do danych po raz pierwszy. Kiedy to zrobisz, te struktury powiedzą hibernacji, że muszą teraz załadować informacje, a Hibernate zrobi to w locie, bez twojej wiedzy o tym, co się dzieje.

Tablic nie można wczytać, ponieważ Hibernate nie może rozpoznać, że próbujesz uzyskać do nich dostęp po raz pierwszy, ponieważ nie można podać proxy operatorowi "[]" (kod bajtowy aaload), Hibernate nigdy nie dowie się, kiedy po raz pierwszy próbowałeś uzyskać do niego dostęp, więc nie będzie mógł załadować go w locie.

Podczas korzystania z kolekcji zawsze trzeba uzyskać do nich dostęp za pomocą ich metod, więc Hibernate może być w 100% pewny, gdy próbujesz uzyskać do nich dostęp po raz pierwszy, a następnie wczytać je.

Prawdziwym powodem jest to, że nie ma sposobu, aby podłączyć kod do operatora dostępu do macierzy. To samo dzieje się w przypadku leniwego ładowania pól, Hibernate nie może leniwego załadować niepobierczej właściwości z dostępem tylko do pola, ponieważ nie wiedziałby, kiedy próbujesz uzyskać dostęp do pola, zawsze musi mieć dostęp do metody get/set.

Jako przykład tego, jak to jest zrobione, można sprawdzić kolekcję PersistentList na Hibernate, na to indexOf metoda (i wiele innych) metoda read nazywa się:

public int indexOf(Object value) { 
    read(); 
    return list.indexOf(value); 
} 

I w końcu read metoda właśnie inicjuje kolekcję, jeśli jeszcze nie została wczytana.

+0

Dziękuję bardzo za odpowiedź. Wygląda na to, że nie można używać Array tylko dlatego, że Hibernate nie może podpiąć operatora dostępu do tablicy. A więc chodzi w zasadzie o ograniczenie języka Java? – fabien7474

+1

Tak, ale jest to ważne ograniczenie z punktu widzenia wydajności, jeśli dostęp do macierzy był wywołaniem metody, wykonałby co najmniej dwie operacje. Nie ma sensu również używać tablicy w tym przypadku, ponieważ dodajesz/usuwałeś obiekty z kolekcji hibernacji i nie jest to coś prostego do zrobienia w tablicy. –

Powiązane problemy