NHibernate generátorok

Aki már készített adatbázisokkal szorosan együttműködő, esetleg még kliens szerver (3-tier) alkalmazást, az tudja, hogy az adatok megkülönböztetéséhez az egyediség a kulcsszó.

No de mi is az egyediség?

Egy olyan egyedi jellemzője a relációs adatbázisban elhelyezkedő adatoknak, amely egyszer, és megismételhetetlenül képződik egy tételhez, és a tétel azonosíthatóságát kizárólagosan biztosítja. Azaz, ha van 1.000.000 adatunk, akkor egy millió egyedi azonosítónak kell lenni, hogy pontosan meg tudjuk határozni azt az egy tételt, amire nekünk szükségünk van. Ezt egyedi kulcsnak, szép angol nevén primary key -nek hívják. Mi lehet egyedi kulcs? Ha egy személyről beszélünk, egyedi kulcs lehet az adóazonosítója, a személyigazolvány száma, vagy a TAJ száma. De mi van, ha számokról beszélünk? Hogyan lehet egy számhalmaznak egyedi azonosítója?

A nagy relációs adatbázis kezelő rendszerek segítségünkre vannak, úgynevezett egyedi kulcs generátorokkal. Ezek lehetnek HASH kódok, egyedi számok, vagy egyszerűen egy GUID.

De ha mi nem Oracle -t, MSSQL -t, vagy IBM DB2 -t használunk, akkor már nincs is lehetőségünk ilyen egyedi kulcsok használatára?

De igen, ha az NHibernate Generator -át hívjuk segítségül.

Mire is valók az NHibernate generátorok? Segítségükkel egy – egy tételhez egyedi kódot, számot tudunk hozzárendelni, így a visszakereshetősége biztosan működni fog.

És most lássuk, milyen lehetőségeket biztosít számunkra az NHibernate! Az NHibernate előre elkészített generátor osztályokkal segíti a munkánkat, illetve biztosít egy egyedi, saját magunk által megírt generátort is beleilleszteni a rendszerbe.

increment: A legegyszerűbb egyedi kulcs készítő. Egy számot növel, így lesz minden egyes tételnek új egyedi kulcsa. Azaz, ha beszúrjuk az első adatot, akkor ez a szám 1 lesz. Ha beszúrjuk a második adatot, akkor ez a szám 2 lesz, ha a harmadik adatot, akkor 3. Ha töröljük az első adatot, és beszúrunk még egyet, akkor ez a szám 4 lesz. És így tovább. A mező típusától függően ez több milliárd egyedi kulcsot biztosít. No de akkor miért nem ezt használja minden rendszer? Azon rendszerek, ahol a gépek és az adatbázisok fürtözve (cluster) vannak, ez a szám ismétlődhet a fürt egy – egy elemében! Azaz elképzelhető, hogy két, teljesen különböző adat ugyanazt az egyedi azonosítót kapja meg. Arra, hogy ez miért így történik, túl rövid ez a bejegyzés! De higgyed el, kedves olvasó! Hogyan definiáljuk?

<id name=”Id” type=”Int64″ column=”uid”>
<generator class=”increment“>
</generator>
</id>

identity: Ez a generátor csak a DB2, MySQL, MS SQL és a Sybase szerverek alól érhető el, ahol van egy speciális rekord típus, az indentity. Az adatbázis által visszaadott típus a Convert.ChangType eljárással alakítja megfelelő típusúvá. Érdekessége ennek a generátornak, hogy az NH2.1 -től ellenőrzi, hogy a RDB tudja -e kezelni az identity értéket, ha nem, akkor megpróbálja szekvenciaként értelmezni. Ha így se megy, akkor trigger típusúként próbálja kezelni. De ha a felhasználónak saját egyedi generátora van, akkor azt a IdentityStyleIdentifierGeneratorClass  függvény felülbírálásával (override) tudja felüldefiniálni!

<id name=”Id” type=”string” column=”uid”>
<generator class=”identity“>
</generator>
</id>

sequence: A szekvencia a IBM DB2, PostgresSQL és az Oracle (illetve a Firebird triggerrel megfejelt) egyedi kódsor készítőjének hívó generátora. Azaz ezek a rendszerek egy teljesen egyedi szekvenciát tudnak létrehozni és átadni. Az adatbázis által visszaadott típus a Convert.ChangType eljárással alakítja megfelelő típusúvá.

<id name=”Id” type=”string” column=”uid”>
<generator class=”sequence“>
</generator>
</id>

hilo: Az egyik újonnan felfedezett kedvencem. A segítségével egy szerver-, és egy kliens oldali egyedi azonosítót lehet készíteni, amelyet aztán összemos, és így keletkezik egy teljesen egyedi kód. Egy példával szemléltetem: A kliens alkalmazás beszúr három új sort. A hilo -nál beállítottunk a max_lo értékét 10 -re. A sorok relációban vannak egymással, például egy dolgozó adatai, és telefonszámai. Ilyen esetben, a dolgozó adatainak az NHibernate 1 -es számot generálja. A kliens 01 -et. Így a dolgozó egyeid azonosítója: 101. Az első telefonszám 102, hiszen a kliens 02 -t generált hozzá, míg a második telefonszám 103 lesz. Ezzel a módszerrel az egy tranzakción belüli tételeket gyönyörűen nyomon lehet követni! Fontos, hogy ezt a generátort nem szabad akkor használni, hogyha a csatlakozási adatokat a felhasználó adhatja meg!

<id name=”Id” type=”Int64″ column=”uid”>
<generator class=”hilo“>
<param name=’table’>idgenerator</param>
<param name=’column’>Id</param>
<param name=’max_lo’>10</param>
</generator>
</id>

seqhilo: Ez a generátor a hilo algoritmust vegyíti a nevesített adatbázis szekvenciával. Azaz az adatbázis egy szekvenciát ad vissza, amihez a kliens oldal hozzádobja a saját egyedi kódját.

<id name=”Id” type=”Int64″ column=”uid”>
<generator class=”seqhilo“>
<param name=’sequence’>IdSequence</param>
<param name=’max_lo’>100</param>
</generator>
</id>

uuid.hex: A System.Guid függvényt hívja meg,  majd a ToString() függvény segítségével egy egyedi Guid -ot (egyedi globális azonosítót: Global Unique Identifier) képez. A szöveg hossza a formátumtól függően változhat.

<id name=”Id” type=”string” column=”uid”>
<generator class=”uuid.hex“/>
</id>

uuid.string: Szintén Guid készítő, de ez az új System.Guid függvényt használja, amely egy byte tömböt ad vissza, és ezt konvertálja a ToString() segítségével szöveggé.

<id name=”Id” type=”string” column=”uid”>
<generator class=’uuid.string‘/>
</id>

guid: Újabb Guid generátor, ami az új System.Guid -ot használja, és az általa kiköpött szöveget menti le!

<id name=”Id” type=”string” column=”uid”>
<generator class=’guid‘/>
</id>

guid.comb: Az új System.Guid függvényt használja, de a generált kód Jimmy Nillson által leírt módon jön létre.

<id name=”Id” type=”string” column=”uid”>
<generator class=’guid.comb‘/>
</id>

native: A relációs adatbázis kezelő saját egyedi kulcs generátorát használja. Ilyenkor rábízza magát az RDBS -re, és az onnan kapott értéket tekinti biztosan érvényesnek!

<id name=”Id” type=”string” column=”uid”>
<generator class=’native‘/>
</id>

assigned: Ezt akkor alkalmazza az NHibernate -et használó programozó, hogyha saját, egyedi azonosítót akar adni az adatainak. Ilyen példa az okmányirodában a dokumentumokra felvezetett egyedi kód. Ezt egy megadott algoritmus számolja, ami biztosan egyedi kódot ad vissza!

<id name=”Id” type=”string” column=”uid”>
<generator class=’assigned‘/>
</id>

foreign: Az egyedi kulcsot egy idegen táblából veszi. Ritkán használatos, csak az egy – egy kapcsolatoknál lehet igazán használni!

<id name=”Id” type=”string” column=”uid”>
<generator class=’foreign‘/>
<param name= ‘property’>Employee</property>
</id>

Related Posts