Makale Özeti

Nhibernate - Nesne Modeli NHibernate, Java'daki sürümü olan Hibernate ile aynı nense modelini korumaya çalışır. Sınıf isimleri, metodlar ve metod imzaları iki ortamda da olabildiğince aynı tutulmaya çalışılır.

Makale

New Page 1

Nhibernate - Nesne Modeli

NHibernate, Java'daki sürümü olan Hibernate ile aynı nense modelini korumaya çalışır. Sınıf isimleri, metodlar ve metod imzaları iki ortamda da olabildiğince aynı tutulmaya çalışılır.

NHibernate.Cfg.Configuration

NHibernate.Cfg.Configuration sınıfından türemiş bir nesne uygula içindeki sınıflar ile veritabanındaki tablolar arasında yer alan olan tüm mapping tanımlamalarını sunmaktadır. Configuration sınıfı kullanılarak ISessionFactory arayüzünden türemiş bir sınıftan örnek elde edilmektedir.

Configuration sınıfının gerekli tüm mapping tanımalamalarını içeremesi için farklı yöntemler izlenebilir.

AddXmlFile metodu

    NHibernate.Cfg.Configuration cf=new NHibernate.Cfg.Configuration();

    cf.AddXmlFile("NHOrnek.hbm.xml");

Configuration sınıfının AddXmlFile metodu parametre olarak bir dosya yolu almaktadır. Bu yöntem ile mapping için kullanılan xml dosyası uygulamaya gömülü olarak değil uygulamanın çalıştırılabilir dosyası ile beraber dağıtılmalıdır. Örneğin yukarıdaki kod bloğunda uygulama ile aynı klasörde olan NHOrnek.hbm.xml dosyasını configuration sınıfından türemiş cf nesnesi yüklemekte ve içerisinde yer alan mapping tanımlamalarını algılamaktadır.

AddClass metodu

      NHibernate.Cfg.Configuration cf=new NHibernate.Cfg.Configuration();

      cf.AddClass(typeof(Musteri));

AddClass metodu parametre olarak hbm.xml dosyasında mapping tanımlaması yapılmış olan bir türü temsil eden System.Type nesnesini parametre olarak alır. Bu yöntem AddXmlFile yöntemine kıyasla tercih edilen bir yöntemdir. Bu metod kullanıldığında mapping tanımlamalarını yapıldığı xml dosyasının uygulamaya Embedded Resource olarak dahil edilmesi gerekmektedir. (Embedded Resource olarak dahil etme işlemini daha önceki makalemizde incelemiştik.)

AddClass metodu kullanılarak bir tür için mapping yapılandırmasının yüklenmesi istendiğinde NHibernate uygumala içinde turismi.hbm.xml dosyasını embedded resource olarak arayacaktır.Yukarıdaki kod bloğunda Musteri sınıfı için AddClass metodu kullanıldığına göre Musteri için gerekli mapping yapılandırmasının yer aldığı Musteri.hbm.xml dosyasını oluşturup, projeye embedded resource olarak eklememiz gerekmektedir. NHibernate çalışma anında bu dosyayı bulamaz ise aşağıda şekilde bir hata mesajı verecektir.

 

AddAssembly Metodu

    NHibernate.Cfg.Configuration cf=new NHibernate.Cfg.Configuration();

    cf.AddAssembly(this.GetType().Assembly);

veya

    NHibernate.Cfg.Configuration cf=new NHibernate.Cfg.Configuration();

    cf.AddAssembly("NHOrnek");

Configuration sınıfının xml mapping yapılandırmalarını yükleyebilmesi için kullanılacak diğer bir yöntem ise AddAssembly metodunu kullanmaktır. Bu metodu kullanarak çalışmak bana göre en pratik yöntemdir. Parametre olarak Bir assembly ismini string olarak veya System.Reflection.Assembly türünde alır. Bu metod assembly dosyası içinde embedded resource olarak saklanmış tüm hbm.xml dosyalarını tarayarak kullanabilir. Bu anlamda uygulama dahil edilmiş olan hbm.xml dosyasının ismi çok önemli olmayacaktır. herhangibirisim.hbm.xml şeklinde bir yapı yeterli olacaktır.

NHibernate.ISessionFactory

İlk adım olarak Configuration sınıfından bir nesne elde edip gerekli yapılandırmaları yüklemesini sağladıktan sonra configuration türündeki nesnenin BuildSessionFactory metodu ile ISession arayüzünü impelente eden "session" nesnelerinin elde edilmesi için kullanılan bir "factory" elde edilir.

NHibernate.ISession

ISessionFactory arayüzünü uygulayan bir "factory" nesnesini elde ettikten sonra bu fabrikadan ISession'ını uygulayan nesneyi elde etmek gerekmektedir. ISession NHibernate içerisindeki veritabanını bağlantısını temsil etmektedir. ADO.NET bilen birisi için örneklendirecek olursak SqlConnection sınıfından örneklendirilmiş bir nesneye benzetilebilir.

   NHibernate.Cfg.Configuration cf=new NHibernate.Cfg.Configuration();

   cf.AddAssembly(this.GetType().Assembly);

   NHibernate.ISessionFactory f=cf.BuildSessionFactory();

   NHibernate.ISession s=f.OpenSession();

OpenSession metodu

ISession.OpenSession metodu veritabanına olan bağlantıyı açar ve bu noktadan sonra veri tabanı üzerinde sorguları çalıştırmak için session nesnemiz üzerindeki metodları kullanmamız gerekmektedir. ISession arayüzünde nesneleri okumak için veya sorgular çalıştırmak için çeşitli metodlar bulunmaktadır.

Get Metodu

ISession arayüzünde yer alan Get metodu ile mapping tanımlaması yapılmış türlerden istenilen örnekler elde edilebilir. Parametre olarak System.Type türünde bir nesne ve System.Object türünde bir nesne alır. Birinci parametre alınmak istenen nesnenin türü, ikinci parametre ise o tür için yapılmış olan mapping tanımlamasında <id> elementi içerisinde tanımlanmış property'nin değeri olmalıdır.

      NHibernate.Cfg.Configuration cf=new NHibernate.Cfg.Configuration();

      cf.AddAssembly(this.GetType().Assembly);

      NHibernate.ISessionFactory f=cf.BuildSessionFactory();

      NHibernate.ISession s=f.OpenSession();

      Musteri m;

      m=s.Get(typeof(Musteri),1) as Musteri;

      s.

      s.Close();

      if (m==null)

      {

        MessageBox.Show("Müşteri bulunamadı.");

      }

      else

      {

        MessageBox.Show(m.Ad + " " + m.Soyad);

      }

Örneğin MusteriID property'si 1 olan Musteri nesnesini elde etmek ve Ad ve Soyad değerlerini göstermek için yazılması gereken kod yukarıda gözükmektedir.

Get metoduna parametre olarak verilen System.Type nesnesinin temsil ettiği tür için yapılmış bir xml mapping tanımlaması bulunmadığında NHibernate aşağıdaki resimde gözüken  Unknown entity class: NHOrnek.Siparis hata mesajını verecektir.

 

 

      NHibernate.Cfg.Configuration cf=new NHibernate.Cfg.Configuration();

      cf.AddAssembly(this.GetType().Assembly);

      NHibernate.ISessionFactory f=cf.BuildSessionFactory();

      NHibernate.ISession s=f.OpenSession();

      Siparis sip;

      sip=s.Get(typeof(Siparis),1) as Siparis;

      s.Close();

      if (sip==null)

      {

        MessageBox.Show("Sipariş bulunamadı.");

      }

      else

      {

        MessageBox.Show(sip.ToString());     

      }

Yukarıdaki örnek kod bloğunda Siparis adında bir tür için Get metodu kullanılmıştır ancak bu sınıf için herhangi bir hbm.xml yapılandırması tanımlaması yapılmadığı için NHibernate Siparis sınıfını tanımadığına dair Unknown entity class: NHOrnek.Siparis hatasını vermiştir.

Eğer Siparis adında bir sınıf uygulamamızda domain object olarak kullanılacak ise kullandığımız configuration nesnesi yapılandırma metoduna bağlı olarak uygun bir hbm.xml dosyası ile doğru xml mapping tanımlamalarının yapılması gerekmektedir.

 

Cengiz HAN
Microsoft ASP.NET MVP
cengiz@cengizhan.com