2009-03-03 11 views
10

Pracuję z systemem, który eksperymentuję z dodawaniem NHibernate do. Mam klasy, które muszę zmapować do tabeli, ale ma wiele istniejących metod, które nie są wirtualne.Jaki jest wpływ leniwy = "false" na element klasy mapowania NHibernate?

Odkryłem, że mogę pobrać NHibernate, aby załadować mapowanie z powodzeniem, nawet przy użyciu metod innych niż wirtualne, jeśli ustawię atrybut "leniwy" na elemencie klasy pliku odwzorowania na "fałsz". Zastanawiam się, jaki wpływ będzie miało to na moje używanie NHibernate w tej klasie.

Rozumiem znaczenie nie-leniwego ładowania na kolekcje, które należą do obiektu, ale nie mam jasności co do znaczenia tego, jakie leniwego lub gorliwego ładowania będzie klasa. Czy to oznacza, że ​​wszystkie zbiory należące do tego obiektu byłyby bardzo obciążone? Czy może to oznaczać, że NHibernate nie używa już dynamicznego proxy zamiast rzeczywistej klasy? Coś innego?

Także, jaki jest najlepszy sposób postępowania tutaj? Czy ustawienie leniwego = wartość false jest niewskazane? Czy powinienem utworzyć interfejs implementowany przez klasę, a następnie zmapować go do tabeli? Czy powinienem po prostu ugryźć kulę i zaznaczyć wszystkie istniejące metody na wirtualnej klasie?

Z góry dziękuję za wszelkie porady!

Odpowiedz

4

Zawsze określam leniwy = false na poziomie klasy w NHIbernate, ponieważ nie chcę, aby NHibernate zmusił mnie do deklarowania, że ​​właściwości mają być wirtualne, jeśli nie chcę tego w moim modelu klasy.

Po określeniu "leniwy" w odwzorowaniu klasy (domyślnie), NHibernate używa klasy "Dynamic Proxy" w środowisku wykonawczym. Ten dynamiczny serwer proxy jest klasą dziedziczącą po klasie. Następnie, o ile rozumiem, instancja klasy powinna zostać zainicjowana leniwie/na żądanie. W niektórych przypadkach powinno to być lepsze dla wydajności (przynajmniej tak się mówi).

Ale ponieważ nie podoba mi się to, że NHibernate mówi mi, jak powinna wyglądać moja klasa, zawsze określałem leniwy = fałszywy dla wszystkich moich zajęć, i nie wpadłem jeszcze w kłopoty. :)

+0

A zatem, aby przed oznaczeniem odpowiedzi jako zaakceptowaną, ustawienie lazy = false na poziomie klasy nie spowoduje, że zbiory klas będą chętne do załadowania? –

+0

Nie, leniwy atrybut na poziomie klasy nie ma wpływu na leniwy atrybut na poziomach kolekcji. (Mam klasy, w których określam leniwy = fałsz na poziomie klasy i leniwy = fałsz na poziomie kolekcji) –

+0

Dzięki, Frederik! Bardzo pomocne! –

2

Korzystanie z leniwego ładowania bardzo skutecznie ogranicza liczbę obiektów. Ta funkcja może być bardzo przydatna w niektórych sytuacjach. Na przykład wyobraź sobie, że masz dwa obiekty Użytkownik i Rola oraz że wszyscy użytkownicy mają 1 lub więcej ról. Podczas ładowania obiektu User należy również załadować wszystkie powiązane role. Jednakże, po załadowaniu Ról dla tego Użytkownika, nie będziesz chciał załadować wszystkich Użytkowników powiązanych z tą Rolą, ponieważ może to skończyć się ładowaniem całej bazy danych Użytkowników.

Tak więc ustawienie lazy = false oznacza, że ​​cały zbiór obiektów dla relacji zostanie załadowany podczas ładowania instancji wywołującej. W niektórych sytuacjach jest to dobre, dobre i odpowiednie, w innych sytuacjach może to prowadzić do problemów z wydajnością.

+1

+1 za "w niektórych sytuacjach". Sprowadzanie leniwych lub nie leniwych powinno być rzeczywiście określone na przypadek użycia! – Hace

1

Rob, To tylko zły projekt. Użytkownik będzie miał Listę typu Role, ale Rola nie będzie mieć Listy typu Użytkownik. Użytkownik jest zbiorczym katalogiem głównym, aby uzyskać wszystkich użytkowników w roli, zdefiniować metodę dla użytkownika na GetByRole(). Dwukierunkowe przejścia, takie jak opisane, tworzą okropny model domeny. Google "odniesień kołowych" i zobacz, dlaczego jest zły.

+1

Zobacz kolekcje odwrócone – Min

Powiązane problemy