Nhibernate – Could not initialize collection

Mateusz Gajda10/29/2018 - 1 min read

Photo by: Alain Wong

Ostatnie parę dni spędziłem na szukaniu rozwiązania problemu, związanego z mapowaniem relacji między obiektami. Dokładniej chodziło o relację one-to-many między obiektami typu Customer a Order. Za każdym razem, chcąc pobrać listę zleceniodawców, NHibernate rzucał mi w twarz błędem, tutaj jego część:

could not initialize a collection: [Designet.Models.Customer.Orders#1][SQL: SELECT orders0_.CustomerId as Custom2_2_1_, orders0_.Id as Id1_2_1_, orders0_.Id as Id1_2_0_, orders0_.CustomerId as Custom2_2_0_, orders0_.Description as Descri3_2_0_, orders0_.Price as Price4_2_0_, orders0_.Created as Create5_2_0_, orders0_.Deadline as Deadli6_2_0_ FROM Order orders0_ WHERE orders0_.CustomerId=?]

Długo szukałem rozwiązania w googlach i na SO, niestety nic z tego nie wynikło. Za nic nie potrafiłem znaleźć odpowiedzi która by go rozwiązała, a przynajmniej tak mi się wydawało, póki nie dowiedziałem się o co dokładniej chodziło. Zdecydowałem się, aby poprosić o pomoc na Stack Overflow. Bardzo nie lubię zawracać głowy ludziom, swoimi problemami, aczkolwiek wizja siedzenia nad tą pierdołą przez kolejne kilka dni, skutecznie mnie zmotywowała że jednak nic nie tracę pytając, najwyżej ludzie mnie opieprzą za głupie pytanie. Nie ukrywam że trochę się zdziwiłem, liczyłem bardziej, przyzwyczajony do realiów polskiego internetu, że zaraz ktoś mi wytknie głupotę pytania, każe szukać w googlach, czy po prostu usunie mój temat. Jednakże udało mi się uzyskać dość kompleksową odpowiedź, wraz z wytłumaczeniem powodu, dlaczego NHibernate rzucał mi wyjątkiem. #### O co dokładniej chodziło?

Otóż, jak już wspomniałem, mapując relację między obiektem Customer i Order, w czasie wywoływania metody GET, ukazywał mi się ładny błąd ,dla zainteresowanych tutaj całość. Wczytując się bardziej w komunikat błędu, a dokładniej w Inner Exception, można zauważyć poniższy komunikat: > Incorrect syntax near the keyword \'Order\'.

Okazało się że tabela, którą nazwałem Order, jest słowem kluczowym w języku SQL, dlatego też, tworząc mapowanie dla tego modelu, wymagane jest użycie tzw. back tilt, co prezentuje się następująco:

<class name=Order table=`Order` ...

I co? I tyle. Tyle wystarczyło by rozwiązać ten dręczący mnie problem. Zapewne każdy miał wiele takich sytuacji, gdy do działania swojego kodu, wystarczyła jedynie mała zmiana w kodzie. Jednakże warto wynieść coś z takich epizodów. Mi się udało dowiedzieć i upewnić w dwóch rzeczach. Po pierwsze dokładnie czytać komunikaty błędów, chociaż to już w trochę mniejszym stopniu, bo wcześniej widziałem ten błąd, jednakże nie wiedziałem z czym dokładniej jest związany. A po drugie że warto pytać. Oczywiście nie o każdą pierdołę, ale szkoda marnować czasu na szukanie samemu rozwiązań, kiedy nawet nie wiadomo czego szukać, tym bardziej że kiedyś, ktoś może sam napotka owy problem i sam już będzie miał odpowiedź na tacy.