Az NHibernate egy objektum-relációs leképező (ORM) megoldás Microsoft .NET platformhoz: keretrendszert biztosít objektumorientált alap modellről hagyományos relációs adatmodellre való leképzéshez. A célja az, hogy levegye a programozó válláról a perzisztencia megvalósítás terhének jelentős részét. Az NHibernate egy ingyenes szoftver, amely nyílt forrás kódú is, a GNU Lesser General Public License licencelt. Az NHibernate a közkedvelt Java O/R leképző Hibernate szoftver pótlásaként keletkezett .NET platformra.

NHibernate

Legfrissebb stabil kiadás4.0.3.GA (2015. január 20.) +/-
Programozási nyelvC#
Operációs rendszerPlatform független (.Net)
Platform.NET 1.1 vagy 2.0 vagy 3.5 vagy 4.0 és Mono
KategóriaObjektum-relációs leképző
LicencGNU Lesser General Public License
A NHibernate weboldala

Képességek összefoglalása szerkesztés

Az NHibernate fő funkcionalitása az, hogy a .Net osztályokat képes leképezni adatbázis táblákra (azaz CLR adat típusokból SQL adat típusokra tud leképezni). Az NHibernate nyújt szolgáltatásokat az adatok visszanyeréséhez is. Az NHibernate generálja az SQL lekérdezéseket, és megkíméli a fejlesztőt azok elkészítésétől, úgy hogy a kód a lehető legszélesebb skálán használható legyen az SQL szolgáltatók számára, az adatbázis portolhatóság megtartása és lehető legkisebb teljesítmény többlet költség mellett.

Az NHibernate átlátszó perzisztenciát nyújt a normál CLR objektumok számára ("Jó öreg CLR Objektumok", POCO-k). Az egyetlen szigorú megkötés az osztály számára a paraméter nélküli konstruktor megléte, amely nem szükséges, hogy public elérési módosítóval legyen ellátva. (Egyes megoldások megfelelő működése különös figyelmet igényel az Equals() és a GetHashCode() metódusok megvalósítását illetően.[1])

Története szerkesztés

Az NHibernate megvalósítását Tom Barrett kezdte el, később Mike Doerfler és Peter Smulovics vette át a fejlesztését. Jelenleg Fabio Maulo a projekt vezetője. 2005 végén, a JBoss Inc.-es (jelenleg a Red Hat része) Sergey Koshcheyev örökölte, és vezette tovább az NHibernate fejlesztéseket teljes munkaidőben.[2] 2006 végén a JBoss leállította a projekt támogatását; jelenleg teljes egészében közösség viszi tovább a projekt fejlesztését.

Az 1.0 verzió inkább a Hibernate 2.1-es verziójának képességeit tükrözte, mint a Hibernate 3-asét, amiből minimálisat valósított meg.

Az NHibernate 1.2.1-et 2007 novemberében adták ki, még több Hibernate 3-as képesség felvonultatásával, és .NET 2.0 támogatással, tárolt eljárások, generikus típusok, és nullable típusok támogatásával.

Az NHibernate 2.0-et 2008. augusztus 23-án adták ki, a Hibernate 3.2 képességeinek szolgáltatásával. Az NHibernate 2.0-s kiadása feladta a .NET 1.1.-es támogatást.[3]

Az NHibernate 2.1 2009. július 17-én látott napvilágot.

Az NHibernate 3.0-et 2010. december 4-én adták ki, és az első olyan verzió volt, amely .Net 3.5-ös verzióját támogatja. Bevezette a beépített LINQ támogatást és egy erősen típusos feltétel-szerű API-t QueryOver néven, új AST-alapú értelmezőt az NHibernate HQL (Hibernate Query Language) motorhoz, ami támogatja az oszlopok lusta betöltését.

Az NHibernate 3.2-t 2011 áprilisában adták ki.

Az NHibernate 3.3-t 2012. április 24-én adták ki.

Újdonságok a NHibernate 3.2-ben[4] szerkesztés

  • Kód alapú leképezés: Könnyű konfigurálás, .hbm.xml használata nem szükséges a továbbiakban;
  • Allekérdezés: SQL nézetek entitásokká képezhetők le;
  • HQL lapozás: TAKE és SKIP a HQL-ben;
  • Beépített bájtkód szolgáltató: eggyel kevesebb DLL, amit telepíteni kell.

Újdonságok a NHibernate 3.3-ban[5] szerkesztés

  • Több fejlesztés a LINQ kiszolgálóban, hogy az általa kezelt lekérdezések halmaza bővüljön.
  • Az id generátorok "enhanced" családjának bevezetése. Ez másolható szekvenciaként vagy táblába, beépített támogatása több id sorozat nyomkövetésére azonos táblában, és egy közös halmaz a optimalizálásokhoz, amelyek implementáltak HiLo vagy Pooled algoritmusokkal is.
  • néhány új funkció az előző verzió kód alapú leképezéséhez.
  • rengeteg hibajavítás más területeken.

Fejlesztések szerkesztés

Nyílt forrású szoftverként az NHibernate-hez rengetegen hozzájárulást kapott a közösségtől. Ezek legtöbbje direkt belső funkcióként került be a szoftverbe, a többit a felhasználók eszközökben és dokumentációkként szolgáltatták.

A LINQ implementáció lehetővé tette a nyelvbe épített lekérdezések NHibernate-es alkalmazását.[6]

Példa szerkesztés

Az alábbi kódrészlet hozzáad egy objektumot az adatbázishoz, illetve vissza nyeri azt, módosít és frissít egy objektumot az NHibernate használatával.

//Hozzá ad egy Customer-t (vásárló) az adattárolóhoz

//'sessionFactory' egy szálbiztos objektum amely egyszer fordul az alkalmazás élettartama alatt (eltarthat pá másodpercig)
//a konfigurációs fájlok alapján amelyek a táblák C# objektumokká történő leképzését határozzák meg
//(értsd, mely tulajdonságok mely oszlopokká kerülnek leképzésre)
//
//'session' nem szálbiztos, gyorsan lekérhető és egy adatbázis kapcsolatként tekinthetünk rá
using (var session = sessionFactory.OpenSession())
{
    //a tranzakció egy db adatátvitelt felügyel
    using (ITransaction transaction = session.BeginTransaction())
    {
        //Az alábbi sor hozzáadja a customert az NHibernate objektum listájához, hogy az adatbázisba illessze azt,
        //de az az SQL insert parancs még ekkor nem kerül végrehajtásra*.
        //*ha a Id-t az adatbázis generálja (értsd automatikusan növelt szám az oszlop típusa)
        //akkor az NHibernate le fogja futtatni az SQL INSERT-et amikor a .Save meghívásra kerül
        session.Save(new Customer { Id = Guid.NewGuid(), FirstName = "Bill", Age = 50 });

        //Az alábbi utasítás lefuttatja az SQL INSERT-et és véglegesíti a tranzakciót a hívással
        transaction.Commit();
    }
}

//Visszanyeri a Customer-t a db-ből, megváltoztatja a bejegyzést és frissíti az adatbázisban
using (var session = sessionFactory.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
    //a session lekérdezése egy IQueryable<Customer>-el tér vissza. (megj.: a LINQ kollekciókkal dolgozik)
    //csak a .FirstOrDefault hívásakor futtatja az NHibernate az SQL lekérdezést
    Customer customer = session.Query<Customer>().Where(c => c.Token == token ).FirstOrDefault();

    //Most már a Customer része a 'session' objektumnak és a NHibernate figyel a rajta végrehajtott változtatásokra
    //tegyük hát meg
    if( customer != null )
    {
        //egy tulajdonság megváltoztatása nem okoz SQL lekérdezést
        customer.TokenVerified = true;

       //A tranzakció véglegesítése egy SQL UPDATE utasítás végrehajtását eredményezi
       //NHibernate követi a 'customer' változásait a betöltése óta
       transaction.Commit();
    }
}

Megjegyzendő, hogy NHibernate beállításain múlik, hogy az NHibernate mikor futtatja az SQL utasításokat.

Kapcsolódó szócikkek szerkesztés

Jegyzetek szerkesztés

  1. hibernate.org - Equals and HashCode
  2. [Hibernate] NHibernate joins Hibernate at JBoss Inc
  3. From NH1.2.1GA to NH2.0.0 - NHibernate. [2015. február 13-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. február 13.)
  4. weblogs.asp.net - nHibernate 3.2 új képességek. [2012. május 7-i dátummal az eredetiből archiválva]. (Hozzáférés: 2012. május 7.)
  5. - nHibernate 3.3 új képességek. [2016. március 4-i dátummal az eredetiből archiválva]. (Hozzáférés: 2012. május 7.)
  6. Implementing Linq for NHibernate: A How To Guide - Part 1. [2010. december 27-i dátummal az eredetiből archiválva]. (Hozzáférés: 2012. május 7.)

Ajánlott könyvek szerkesztés

Külső hivatkozások szerkesztés

Fordítás szerkesztés

Ez a szócikk részben vagy egészben a NHibernate című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.