NHibernate

by mitkoka 22. Ноември 2008 05:46

 

NHibernate

 

NHibernate представлява обектно – релационен мапър изграден на основата на Hibernate ver. 2.1.Последната версия на NHibernate e 1.2.1 и включва доста функции от Hibernate 3 както и подръжка на .NET 2.0, съхранени процедури и дженерикс типове.В момента се разработва версия 2.0.

Моделирането възоснова на обектно - релационния модел представлява преобразуване на релационния модел на базите данни до обектно ориентиран вид чрез съответствия от вида клас – таблица и свойство – колона.Този подход за моделиране се нарича Data Mapper.

При работа с Hibernate(NHibernate) най - общо процедурата е следната:Създаваме клас съответстващ на предварително създадена таблица в база данни.Този клас има полета и свойства съответстващи на колони от съответната таблица.При компилирането на този фаил NHibernete ще достъпва тези полета чрез рефлекция.

След като имаме таблица и съответстващ на нея клас трябва да направим фаил за съответствията (map file).Това е xml фаил съдържащ съответствията между таблицата и класа.Записва се с разширение (име на клас).hbm.xml и трябва да бъде записан като embedded resource за да бъде част от асеблито.При дефинирането на съответствията трябва да се окаже асемблито за да може NHibernate-a да го открие.

Също така трябва да имаме и кофигурационен фаил, който да описва текущата конфигурация на NHibernate-a.

Конфигуриране на NHibernate

Конфигурирането може да стане програмно или чрез XML фаил.Тъй като NHibernate предоставя богати възможности за работа с различни бази данни съществуват множество променливи, чрез които може да стане конфигурацията.При програмното конфигуриране подаваме IDictionary колекция от променливи на Configuration.SetProperties().При използването на XML фаил имаме няколко възможности.Можем да създадем конфигурационна секция за NHibernate в кофигурационния фаил на приложението.Той би могъл да бъде например web.config.Тази секция трябва да се казава<nhibernate>.Също така може да се използва специален конфигурационнен фаил hibernate.cfg.xml, който да съдържа единствено ифнормация за кофигурирането на NHibernate.Записването на стойностите на свойствата в кофигурациония фаил става чрез атрибут <add key=”” value=”” />

Кофигуриането на връзката с базата данни става чрез задаване на стойности на променливите отговарящи за това.

Променливите включват определяне на hibernate.connection.provider_class като NHibernate поддържа собствени класове, които могат да бъдат зададени като стойност.В противен случай може да се използва асембли и клас имлементиращ IConnectionProvider.Същото се отнася и за променливата hibernate.connection.driver_class.Определя се и стойност, на hibernate.connection.connection_string и hibernate.dialect hibernate.dialect.Последната съдържа информация за базата данни която ще достъпваме.Стойностите на тзаи променлива са предварително определени според това какви бази данни поддържа версията на NHibernate – а, с която се работи.Поддържат се всички известни бази данни.

 

Файолве на съответствията (Мапинг файолве)

В  тези файлове записваме връската между таблиците и класовете.Един xml фаил може да съдържа повече от един клас.Могат да бъдат написани ръчно или да се използват специални инструменти генериращи .hbm.xml документи.Това какви елемнти ще съдържа мапинг файла зависи от конкретната таблица и връзките и с останалите таблици.Мапинг файловете са написани object-centric, което означава че са създадени спрямо структурата на класовете а не на таблиците. 

<hibernate-mapping> - това е елементът, в който посочваме място на нашия клас.Това става с елементите namespace и assembly.Атрибутите в този елемент не са задължителни.

<class> - Това е елементът определящ връзката таблица -  клас.Поделементите му от своя страна определят връзката име на колона – свойство.Единствените задължителни атрибути тук са table и name.Възможно е да се постави като атрибут  where - SQL клауза с цел да се извлвче определена част от таблицата.Може да бъде зададено как ще става записването на данните в таблицата.Определя се също дали при зареждане на даден обект ще бъдат зареждани и неговите под обекти при по – сложна йерархия от класове.

В клас елемента се поставя поделемент <id>, който ни дава уникален идентификатор на инстанцията на класа и първичния ключ от таблицата.<id> елемента съдържа под елемент <generator> генериращ идентификатора ако трябва да се подадат някакви параметри се използва елемент <param>.Подаваме различни параметри според това каква база данни използваме.Например sequence за Oracle и identity за MS SQL Server.

Когато имаме копозитетeн първичен ключ, тогава трябва да се запише всяка една колона от таблицата, определяща този ключ в отделен <key-property> елеменът.Тогава вмсето <id> използваме <composite – id>.

<discriminator> елементът, част от <class> секцията определя колона в таблицата, която ще бъде използвана като дискриминатор.Стойноста в тази колона се използва, когато в основния клас имаме клсове наследници на общ клас.Тогава стойноста в тази колона определя какъв клас да бъде инстанциран.Наличието на дискриминатор осигурява полиморфизъм на класовете наследници на базовия.

Елементът <property> осигурява връзката колона – свойство.Той е част от <class> елемента.Задължителен атрибут е именто на свойството от клас.Ако не бъде посчена колона от таблица, по-подразбиране се търси колона с името на свойството.Типът на данните също не е задължителен – може да бъде определен от посоченето асембли.

<may-to-one> и <one-to-one> са елементи, чрез които се посочва връзка към друг клас изразяващ на таблица.Единствения задължителен елемент тук е property, който определя свойство от външния клас.Ако е зададено само свойство тогава колната на таблицата съдържаща външния ключ съвпада с името на свойството, а класа в който се намира свойството се определя чрез рефлекция.Типът на свойството определя подразбиращата се стойност на елемета class.Има възможност да бъде посочена колона с уникални стойости от външната таблица, която не представлява първичен ключ.Ако това не бъде направено по подразбиране се използва колоната с първичния ключ.

В случай, че имаме базов клас с един или повече наследника, а в таблицата съответстваща на този клас имаме колона дискримитор, която се грижи за полиморфизма на базовия клас трябва да изразим това в мапинг файла.Това става чрез елемент <subclass>.Като атрибут на този елемент посочваме стойност  съдържаща се в колоната дискриминататор discriminator-value.Така се определя какъв клас съответсва на всеки ред от таблицата. Ако под клсаовете са в отделна таблица тогва се използва елемента <joined- subclass>.Тъй като всеки клас наследник в този случай има собствена таблица в базата колона за дискриминатор не съществува и съответно нямаме атрибут discriminator-value.Останалите атрибути са същите както при <subclass> елемента.

В файла на съответствията има възможност да бъдата посочвани коленкциите садържащи се в калса.За това се грижат елементите <set>, <list>, <map>, <bag>, <array> и <primitive-array>.Важно е да се отбележи, че NHibernate изисква колекциите в класовете да бъдата декларирани чрез интерфейс.Колекцията съдържаща се в една таблица има собствена таблица.В рамките на един елемент отразчващ колекция се записва връзката между таблицата на каласа и таблицата на колекцията <one-to-many>, <many-to-many>.Посочват се също колоните, чрез които ще се осъществи връзката между отделните таблици.

Колекциите съдържат елемент lazy.Чрез него се определя кога колекцията да бъде заредена.За да не се хабят ресурси колекцията може да бъде заредена когато действително има нужда от нея.

 

Методи за получаване на обекти от база  данни

Чрез NHibernate имаме възможност да извличаме обекти както от таблици така и от изгледи(view) .Това става като вместо име на таблица забишем име на изглед в атрибута <class>.

Начините за обработка на данни в чрез NHibernate са следните:

<!--[if !supportLists]-->·         <!--[endif]-->Чрез HQL(Hibernate Query Language)

<!--[if !supportLists]-->·         <!--[endif]-->Чрез стандартен SQL

<!--[if !supportLists]-->·         <!--[endif]-->Чрез  Query By Criteria (QBC) и Query By Example (QBE)

Препоръчва се изплозването на HQL пред останалите два метода.Това е език подобен на SQL но по – гъвкав от него, защото предоставя допълнителна функционалност.За разлика от SQL  той не използва таблици и колони, а класове и свойства.Също така HQL връща дирктно обект, а това че работи с обекти му дава възможност да доразвие стандартния sql до обеkтно ориентиран език.

Можем да извличаме данни и чрез използването на NHibernate.ICriteria, който изразва заявка към базата.За създаването на ICriteria обект се използва ISession обект.Ако не бъдат зададени критерии към заявката то тя просто ще върне всички данни от съответната таблица.

ICriteria crit = sess.CreateCriteria(typeof(Cat));

List cats = crit.List();

Могат да бъдат задавани всякакви SELECT чрез методите на клас NHibernate.Expression.Expression, чрез който можем да добавим определени ограничения на връщаните рзултати:

IList cats = sess.CreateCriteria(typeof(Cat))
.Add( Expression.Like(“Name”, “Fritz%”) )
.Add( Expression.Between(“Weight”, minWeight, maxWeight) )
.List();

Влкючват се ралични методи, с които се филтрират данните идващи от заявката.Възможно е и да се добави чист SQL към критерите на заявката без да се използват останалите методи на класа Expressinon.

Заявки могат да бъдат подавани и чрез конкретен обект.Създаваме обекта на класа към чиято таблица ще бъде отправена заявката и го подаваме със съответните стойности на метода Create() на клас  NHibernate.Expression.Example.

Използването на SQL в NHibernate става чрез ISQLQuery.Методът  ISession.CreateSQLQuery() взема като аргумент SQL заявката и връща Query обект.От този обект се извлича информацията като се извикват неговите методи определящи например вида на изходните данни – дали да бъдат представени като обекти или да бъдат просто стойности.Чрез методът SetString() добавяме параметрите към заявката ако има такива,а данните излизат от Query обекта чрез извикването на метода List(), който връща IList.

В NHibernate могат да се използват и наименовани SQL заявки(Named SQL queries).Тези заявки се пишат директно в мапинг файла и се извикват прогрмано чрез името, което им е зададено.По този начин могат да бъдат извиквани и съхранени процедури.Във файла на съответствията се записват данните които трябва да бъдат получени от съхранената процедура (ResultSet).Самата съхранена процедура се извиква според това с каква база работим.

 

 

Tags:

ASP.NET | C#

Коментари

Добави коментар


(Показва вашата Gravatar икона)  

  Country flag

biuquote
  • Коментар
  • Актуален изглед
Loading