Menu Zamknij

NHibernate – Relacja One-To-Many

Ogólnie o relacjach

Tym razem będzie trochę krócej i omówimy sobie relacje między obiektami. Mając skonfigurowanego NHibernate (jeżeli jeszcze tego nie zrobiłeś to odsyłam do poprzedniego wpisu tutaj), możemy dodać relację między obiektami, które dzielimy następująco:

  • One to one
  • One to many
  • Many to one
  • Many to many

W przypadku relacji one to one, jeden wiersz tabeli A, może zawierać powiązanie z maksymalnie jednym wierszem z tabeli B. Przykładem z życia wziętym jest relacja między człowiekiem a jego dowodem osobistym. Każdy z nas może posiadać tylko jeden dowód, oczywiście możemy wyrobić nowy dowód, jednakże stary nie będzie już ważny, przez co dalej zachowujemy relację jeden do jednego. Tak samo w drugą stronę. Jeden dowód osobisty, może należeć tylko do jednej osoby. Dzięki temu, mając wiele różnych dowodów osobistych, wybierając jeden, wskazuje nam on na konkretną osobę.

Relacja one to many, jeden wiersz danej tabeli może być powiązany z wieloma wierszami innej tabeli w bazie danych. Aby lepiej to zobrazować możemy wyobrazić sobie że jesteśmy w bibliotece i jako czytelnik mamy możliwość wypożyczenia wielu książek. Działa to również w drugą stronę, bazując dalej na przykładzie biblioteki, wielu czytelników może w jednym czasie znajdować się w bibliotece, co sprawia że w tym wypadku zachodzi relacja many to one.

Kiedy jesteśmy w sytuacji że wiele wierszy z tabeli A możemy powiązać z wieloma wierszami z tabeli B, gdzie wiersze z drugiej tabeli są powiązane z wierszami z tabeli pierwszej, mamy do czynienia z relacją many to many. To podobnie jak z książkami, mogą mieć one wielu autorów, tak jak to bywa w przypadku różnego rodzaju publikacji naukowych. A z kolei autorzy, mogą napisać wiele różnych książek.

Jest to taki krótki wstęp, dla osób które nie do końca wiedzą o co chodzi z relacjami między obiektami. Można dawać tu wiele różnych przykładów wyjaśniających to „zjawisko”, jednakże mam nadzieję że te które tu przytoczyłem, wyjaśnią chociaż pobieżnie o co chodzi. Przejdźmy jednak do praktyki, jak zaimplementować owe relacje w naszych plikach .xml?

One to many

Załóżmy że mamy listę zleceń od naszych klientów. W bazie danych, w jednej tabeli znajduję się zbiór wszystkich zleceniodawców. Każdy z nich możemy posiadać wiele zleceń.

Zacznijmy więc od zdefiniowania obiektów biznesowych:

Obiekt Customer posiada pola Id oraz Name. Można go oczywiście rozwinąć o dokładne dane zleceniodawcy, ale skupmy się bardziej na idei tworzenia relacji. Na pewno uwagę zwraca interfejs IList zawierający zlecenia. Należy pamiętać że mapowane kolekcje muszą być reprezentowane przez interfejsy.

Aby zmapować relację pomiędzy obiektami musimy użyć tagu bag, dzięki któremu NHibernate wie że pracujemy na kolekcjach. Name musi pasować do publicznej właściwości obiektu którego będziemy używać, w tym wypadku obiekt Customer posiada listę Orders. Następnie musimy podać nazwę tabeli, powiązaną z naszym obiektem. Możemy zdecydować czy chcemy włączyć lazy loading, czyli opóźnienie załadowania obiektu, aż do momentu kiedy będziemy potrzebować tych danych. W tym celu ustawiamy pole lazy na true albo false. Pole inverse, w naszym przypadku ustawiamy na wartość true, tutaj znajduje się wyjaśnienie dlaczego. Następnie możemy zdefiniować wartość cascade. Określa ona powiązanie obiektów ze sobą. Przykładowo, ustawiając cascade na wartość all-delete-orphan, sprawiamy że gdy manipulujemy obiektem (zapisujemy go, edytujemy czy też kasujemy), sprawdzane są jego powiązania, a następnie wykonywane takie same operacje na obiektach powiązanych. Dodatkowo, kiedy usuniemy obiekt, mający relacje one-to-many, wszystkie pozostałe obiekty do niego przypisane również ulegną usunięciu.

W tagu one-to-many, musimy podać miejsca w którym znajduje się nasz plik Order.hbm.xml.

W przypadku mapowania klasy Order, wystarczy umieścić tag many-to-one, wraz z właściwością name oraz column. Gdzie name odnosi się do obiektu będącego w relacji z naszą klasą, a column do identyfikatora klasy.

I to tyle jeżeli chodzi o relację one-to-many w NHibernate. Nie jest to skomplikowana sprawa, jeżeli mamy do czynienia z prostą relacją. Oczywiście jest wiele możliwości rozwijania i modyfikowania relacji, ze względu na nasze preferencję, aczkolwiek w tym wpisie chciałem skupić się ogólnie na podstawach. Postaram się również przybliżyć kwestię relacji many-to-many, ale to następnym razem.

 

1 Komentarz

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *