Регистрация    Вход    Форум    Поиск    FAQ

  •  Новости
  • Beeline + Twitter = чирикай через SMS!

    Beeline + Twitter = чирикай через SMS! На первой картинке обозначены команды, при помощи которых через SMS Вы сможете кого-либо зафолловить или же отписаться, ретвитнуть чей-либо пост или же написать личное сообщение.

    Open Graph Protocol. От создателей Facebook

    Open Graph Protocol. От создателей Facebook Разбираясь с Facebook API, случайно наткнулся на другую интересную разработку от этих людей.

    Глобальное ускорение Wordpress

    Глобальное ускорение Wordpress Не считая очевидных решений типа отключения некоторых плагинов и перехода на тему попроще, я вижу 2 пути для оптимизации: кэширование и сжатие траффика.




  •  Часы


  •  Поиск

Optimaze » Программирование » Библиотека NHibernate




Библиотека NHibernate

  1. Напишем класс доступа к ISessionFactory:


Недавно, в своей профессиональной деятельности, я столкнулся с необходимостью организации быстрого, и легкого в реализации доступа к данным бд, причем, настолько быстрого, чтобы даже особо sql запросы писать не надо было.

 

Тут на помощь пришла библиотека NHibernate, являющаяся реализацией под технологию .NET библиотеки Hibernate под Java.

Данная библиотека интересна тем, что скрывает всю работу с базой данных, вплоть до установления соединений. Оперировать приходится с объектами классов, описывающих конкретные сущности базы данных. Правда удобно?

 

Надо всего лишь написать классы, отвечающие определенным требованиям, создать для них xml файл с описанием сущностей и отношений, между ними… и вуаля, NHibernate автоматически сгенерирует sql запросы для выгрузки и записи обьектов.

 

Итак, приведу легкий пример использования:

Допустим у нас есть простенькая табличка PRICE с прайс-листами со следующими колонками:

 

Id (PK, int, not null)

FromDate (datetime, not null)

ToDate (datetime, not null)

Comment (nvarchar(max), null)

 

1. Для начала нам собственно понадобиться сама библиотека, которая лежит по адресу http://www.hibernate.org/6.html

2. Далее, создать Web project и добавить туда ссылку на библиотеку NHibernate. dll.

3. Теперь надо сконфигурировать доступ NHibernate к базе данных. Для этого в конфиге Web. config надо написать строчки типа:

 

<?xml version="1. 0" encoding="utf-8"?><configuration><configSections><sectionname="hibernate-configuration" type="NHibernate. Cfg. ConfigurationSectionHandler, NHibernate"/>

</configSections><hibernate-configuration xmlns="urn:nhibernate-configuration-2. 2">

<session-factory>

<property name="dialect">NHibernate. Dialect. MsSql2005Dialect

</property>

<property name="connection. provider">NHibernate. Connection. DriverConnectionProvider

</property>

<property name="connection. connection_string">

Server=(local);initial catalog=prices;

Integrated Security=SSPI

</property>

<mapping assembly="Prices" />

</session-factory>

</hibernate-configuration>

<system. web>

...

</system. web>

</configuration>

 

4. Создать класс PriceList. cs, описывающий сущность. При этом надо учитывать, что все свойства должны быть виртуальными:

public class PriceList{private int id;private DateTime fromDate;

private DateTime toDate;

private string comment;

public PriceList()

{

}

public PriceList(DateTime fromDate, DateTime toDate)

{

this. fromDate = fromDate;

this. toDate = toDate;

}

public RedPriceList(DateTime fromDate, DateTime toDate, string comment)

{

this. fromDate = fromDate;

this. toDate = toDate;

this. comment = comment;

}

public static readonly string IdPropertyName = "Id";

public virtual int Id

{

get { return id; }

set { id = value; }

}

public static readonly string FromDatePropertyName = "FromDate";

public virtual System. DateTime FromDate

{

get { return fromDate; }

set { fromDate = value; }

}

public static readonly string ToDatePropertyName = "ToDate";

public virtual System. DateTime ToDate

{

get { return toDate; }

set { toDate = value; }

}

public static readonly string CommentPropertyName = "Comment";

public virtual string Comment

{

get { return comment; }

set { comment = value; }

}

public override bool Equals(object obj)

{

return id == ((PriceList)obj). id;

}

public override string ToString()

{

return id. ToString();

}

}

 

5. Сделать обёртку в виде xml файла PriceList. hbm. xml:

<hibernate-mapping

xmlns="urn:nhibernate-mapping-2. 2"

assembly="Prices" namespace="Prices">

<class name="PriceList" table="PRICE"><id name="Id" column="Id">

<generator class="native">

</generator>

</id>

<property name="FromDate" column="FromDate" type="DateTime" not-null="true"></property>

<property name="ToDate" column="ToDate" type="DateTime" not-null="true"></property>

<property name="Comment" column="Comment" type="string" not-null="false"></property>

</class>

</hibernate-mapping>

 

Тут вроде всё должно быть понятно, указываем соответствие названий свойств класса и колонок таблицы, а также их тип. Как можно видеть, идентификатор в этом случае описывается отдельно, причем в теге generator в атрибуте class указывается, что будет использована встроенная генерации идентификаторов.

 

Есть возможность создать свой класс генерации идентификаторов, который обязан реализовать интерфейс NHibernate. Id. IIdentifierGenerator. Кстати, не забудьте указать в свойствах этого xml файла Build Action = Embedded Resource! Иначе NHibernate не сможет использовать ваш описатель класса. А теперь данный файл будет включен в итоговую сборку.

 

6. Далее надо запускать NHibernate интерфейс ISession. Этот интерфейс используется для сохранения и извлечения обьектов из базы. Его необходимо получать из ISessionFactory. ISessionFactory отвечает за одну базу данных, используя данные из конфигурационного файла. Данный интерфейс создается однажды, при запуске в обработчике Application_Start.

Следовательно, нам нужно иметь доступ к этому обьекту из всего приложения. Для реализации данной функциональности очень подходит паттерн Singleton.

 

Напишем класс доступа к ISessionFactory:

using System;

using System. Web;

using NHibernate;

using NHibernate. Cfg;

 

namespace NhibernatePreview

{

    public sealed class NHibernateHelper

    {

        private const string CurrentSessionKey = "nhibernate. current_session";

        private static readonly ISessionFactory sessionFactory;

        static NHibernateHelper()

        {

            sessionFactory = new Configuration(). Configure(). BuildSessionFactory();

        }

        public static ISession GetCurrentSession()

        {

            HttpContext context = HttpContext. Current;

            ISession currentSession = context. Items[CurrentSessionKey] as ISession;

 

            if (currentSession == null)

            {

                currentSession = sessionFactory. OpenSession();

                context. Items[CurrentSessionKey] = currentSession;

            }

            return currentSession;

        }

        public static void CloseSession()

        {

            HttpContext context = HttpContext. Current;

            ISession currentSession = context. Items[CurrentSessionKey] as ISession;

 

            if (currentSession == null)

            {

                // No current session

                return;

            }

 

            currentSession. Close();

            context. Items. Remove(CurrentSessionKey);

        }

 

        public static void CloseSessionFactory()

        {

            if (sessionFactory != null)

            {

                sessionFactory. Close();

            }

        }

    }

}

 

Теперь в приложении можно написать следующие строки, которые показывают всю мощь этой библиотеки:

  • ISession session = NHibernateHelper. GetCurrentSession();
  • ITransaction tx = session. BeginTransaction();
  • PriceList priсe = new PriceList();
  • priсe. FromDate = DateTime. Now;
  • priсe. ToDate = DateTime. Now;
  • priсe. Comment = "Nhibernate rules the world!!";
  • session. Save(priсe);
  • tx. Commit();
  • NHibernateHelper. CloseSession();

 

Таким образом, мы только что создали обьект PriceList и сохранили его в базе данных. Теперь в таблице есть строка с этими данными.

При этом не написав ни одного запроса. Как можно, заметить, удобство на лицо.

 

Nhibernate является чрезвычайно удобным средством для создания Data Access Layer.



Рейтинг: 4.6/5, основан на 25 голосах.


Нравится



Вернутся назад


   

Вам будет интересно:

Первое сравнение производительности Tiger (Java SE 5) и Mustang (Java SE 6)

Результаты своего сравнительного тестирования производительности текущей и следующей версии Java - Tiger (Java SE 5) и Mustang (Java SE 6) соответственно.

Подсчет оставшегося времени на PHP

Опишу одну функцию, которая позволяет отсчитать оставшееся время до какой-нибудь даты.

Silverlight & Web ADF ArcGIS Server

Если у вас есть чувство, что в достаточной мере знаете что такое CLR и прочее - не слишком обольщайтесь.

Улучшаем блог с помощью jQuery

Считайте это третьей частью “симбиоза jQuery и WordPress”.



  •  Публикации


8 методов раскрутки своего форума с нуля

8 методов раскрутки своего форума с нуля Итак, у вас имеется свой собственный форум, но его никто не посещает? Мы готовы помочь вам справиться с этой нелегкой проблемой.

Как привлекать посетителей на проект

Как привлекать посетителей на проект Данная статья в основном рассчитана на тех, кто самостоятельно занимается продвижением своего проекта.

Про MySQL, серверы и PayPal

Про MySQL, серверы и PayPal Проклял все настройки кодировок, проклял DirectAdmin и еле-еле нашел то место где располагается и задается общий пароль для ...

Реклама в Твиттере. Как подать свой продукт

Реклама в Твиттере. Как подать свой продукт Твиттер уже давно стал из нового web 2. 0 сервиса рекламной площадкой с огромным количеством потенциальных пользователей ...

Пока блог на локалхосте

Пока блог на локалхосте Самое время кратко описать, чем нам придется заниматься. Прежде всего нужно понять, что блог ты будешь делать для получения ...

Авторитет блоггера притягивает

Авторитет блоггера притягивает Долго не знал с чего начать данную статью. Статья что-то типа мыслей вслух и философии.