9 fluent hibernate.pdf

79
 1 0 Sistemi  baza  podataka Fluent  NHibernate Ra  čunarstvo i informatika Katedra za računarstvo  Elektronski fakultet u Nišu Letnji semes tar 2015

Upload: aleksandar-aca-marinkovic

Post on 04-Nov-2015

233 views

Category:

Documents


0 download

TRANSCRIPT

  • 10

    Sistemi baza podataka

    Fluent NHibernate

    Raunarstvo i informatika

    Katedra za raunarstvo

    Elektronski fakultet u Niu

    Letnji semestar 2015

  • 20Fluent NHibernate

    Fluent NHibernate je projekat koji predstavlja alternativu kreiranju

    standardnih NHibernate xml datoteka za mapiranje.

    Fluent NHibernate omoguava kreiranje NHibernate mapiranja

    korienjem C# koda sa jako definisanim tipovima podataka.

    Ovakav pristup obezbeuje kreiranje lako itljivih i konciznih

    mapiranja.

    Fluent NHibernate nije sastavni deo NHibernate projekta ve

    redstavlja nezavistan projekat.

    Homepage: http://www.fluentnhibernate.org/

    Tekua verzija: 2.0.1

    Sistemi baza podataka

  • 30Fluent NHibernate

    Svaka nova verzija Fluent NHibernate biblioteke je dostupna kao

    NuGet paket.

    NuGet predstavlja menader paketa za Microsoft Visual Studio

    razvojno okruenje.

    Homepage: http://www.nuget.org/

    NuGet instalacija: http://docs.nuget.org/consume/installing-nuget

    Nakon instalacije NuGet Package Manager Console je dostupna u

    Visual Studio razvojnom okruenju korienjem stavke menija:

    Tools / NuGet Package Manager / Package Manager Console

    Sistemi baza podataka

  • 40Fluent NHibernate

    Fluent NHibernate NuGet paket:

    http://www.nuget.org/packages/FluentNHibernate

    Instalacija korienjem NuGet Package Manager Console:

    PM> Install-Package FluentNHibernate

    Sistemi baza podataka

  • 50Fluent NHibernate

    Instalacija korienjem NuGet menadera paketa reava problem

    meuzavisnosti paketa, pa zajedno sa Fluent Nhibernate

    bibliotekom instalira i neophodne biblioteke NHibernate i

    Iesi.Collections.

    Sve instalirane biblioteke NuGet ukljuuje kao reference u tekui

    Visual Studio projekat.

    Sistemi baza podataka

  • 60Fluent NHibernate

    Primer: Deo baze podataka Lanac prodavnica igraaka

    Sistemi baza podataka

  • 70Fluent NHibenrate

    Struktura projekta:

    Direktorijum Entiteti sadre domenske entitete (klase)

    Direktorijum Mapiranja sadri klase koje domenske entitete mapiraju na relacionu bazu podataka

    Sistemi baza podataka

  • 80Fluent NHibernate

    Entitet PRODAVNICA

    Domenska klasa Prodavnica.cs

    Nalazi se u direktorijumu Entiteti. Ovde e biti kreirane sve domenske klase.

    Klasa mora da bude deklarisana kao public u okviru svog namespace-a

    Sva svojstva klase koja e biti mapirani na kolone u tabeli relacione baze podataka moraju biti deklarisana kao public

    Sva svojstva klase koja e biti mapirana na kolone u tabeli relacione baze podataka moraju biti deklarisana kao virtual. NHibernate predefinie sva

    svojstva kako bi obezbedio proxy za lazy load uitavanje podataka.

    Sistemi baza podataka

  • 90Fluent NHibernate

    Sistemi baza podataka

  • 10

    0Fluent NHibernate

    Mapiranje PRODAVNICA

    Klasa ProdavnicaMapiranje.cs

    Nalazi se u direktorijumu Mapiranja. Ovde e biti kreirane sve klase koje mapiraju domenske entitete na relacionu bazu podataka.

    Klasa za mapiranje nasleuje klasu ClassMap pri enu T predstavlja domensku klasu koja se mapira. U konkretnom sluaju klasa ProdavnicaMapiranje

    e naslediti klasu ClassMap

    Sva mapiranja se navode u konstruktoru klase za mapiranje

    Sistemi baza podataka

  • 11

    0Fluent NHibernate

    Sistemi baza podataka

  • 12

    0Fluent Nhibernate

    NHibernate aplikacija svoj rad bazira na korienju dva

    kljuna interfejsa:

    ISession

    Primarni interfejs u NHibernate apliakcijama

    Interfejs za rad sa NHibernate sesijama

    Obezbeuje metode za osnovne CRUD operacije

    Persistance manger poto obezbeuje mehanizme za perzistenciju objekata

    Jednostavno kreiranje i unitavanje sesije (ne zahteva puno resursa)

    Nije thread safe. Nhibenate sesija se koristi samo u okviru jedne niti

    Odgovara konekciju kod ADO.NET biblioteke

    Sistemi baza podataka

  • 13

    0Fluent NHibernate

    ISessionFactory

    Obezbeuje metode za kreiranje NHibernate sesija

    SessionFactory je jako zahtevan sa stanovita resursa koje zahteva

    Projektovan je tako da se kreira jedna instanca u aplikaciji koaj se deli

    izmeu vee broja niti.

    Ukoliko aplikacija pristupa razliitim bazama podataka, za svaku bazu

    podataka se kreira po jedna SessionFactory instanca

    Keira meta podatke i SQL upite koje Nhibernate generie tokom

    rada

    Obezbeuje korienje second-level keiranja podataka. Podaci koji su

    pribavljeni u nekoj Unit of Work sesiji se kasnije mogu koristiti u

    drugim Unit of Work sesijama. Potrebno je eksplicitno konfigurisati

    podrku za ovu vrstu kea.

    Sistemi baza podataka

  • 14

    0Fluent NHibernate

    Konfiguracija NHibernate mehanizma u aplikaciji je

    implementirana u klasi DataLayer u vidu dve static

    metode: public static ISessionFactory CreateSessionFactory()

    Konfiguracija baze podataka

    Kreiranje i konfigurisanje SessionFactory objekta

    public static ISession GetSession()

    Implementacija singleton pattern-a koja obezbeuje samo jednu instancu SessionFactory objekta u aplikaciji

    Otvaranje NHibernate sesija

    Sistemi baza podataka

  • 15

    0Fluent NHibernate

    Thread safe implementacija singleton pattern-a

    CreateSessionFactory metoda se poziva samo ukoliko prethodno

    objekat SessionFactory nije kreiran

    Metoda kreira i otvara NHibernate sesiju

    Sistemi baza podataka

  • 16

    0Fluent NHibernate

    Sistemi baza podataka

  • 17

    0Fluent NHibernate

    Konfiguracija baze podataka:

    U konkretnom sluaju za Oracle DBMS specificira se Oracle dialect i Oracle connection string

    Primeri konfiguracija: https://github.com/jagregory/fluent-nhibernate/wiki/Database-configuration

    Kreiranje i konfiguracija SessionFactory objekta:

    Definie se odgovarajua konfiguracija baze podataka

    Specificiraju se mapiranja koja e se koristiti (U konkretnom sluaju specificiraju se sva mapiranja koja se nalaze u istom assembly-iju kao i klasa

    ProdavnicaMapiranja)

    Specifikacije mapiranja: https://github.com/jagregory/fluent-nhibernate/wiki/Fluent-configuration

    Napomena: Za sluaj Oracle DBMS-a, na raunaru na

    kome e se aplikacija koristiti neophodno je instalirati

    odgovarajuu verziju Oracle klijenata.

    Sistemi baza podataka

  • 18

    0Fluent NHibernate

    Primer jednostavne operacije uitavanja podatka:

    Sistemi baza podataka

  • 19

    0Mapiranja

    Klasa ClassMap predstavlja osnovnu klasu za sva

    FluentNHibernate mapiranja.

    public class ProdavnicaMapiranja : ClassMap

    {

    public ProdavnicaMapiranja()

    {

    }

    }

    Sva mapiranja se definiu u okviru konstruktora klase za mapiranje.

    Sva mapiranja imaju oblik lambda izraza: x => x.Property

    Sistemi baza podataka

  • 20

    0Mapiranja

    Id metoda koja se koristi za mapiranje atributa klase kojiobezbeuje jednoznanu identifikaciju domenskih entiteta.

    Ovi atributi klase se mapiraju na primarni klju u tabel relacione

    baze podataka.

    Id(x => x.Id)

    .Column("BROJ")

    .GeneratedBy.TriggerIdentity();

    U konkretnom primeru atribut klase Id je mapiran na kolonu BROJ

    u tabeli. Za definisanje vrednosti primarnog kljua se koristi triger

    baze podataka.

    Sistemi baza podataka

  • 21

    0Mapiranja

    Neki od tipinih opcija za generator primarnog kljua:

    Assigned Aplikacija definie vrednost primarnog kljua pre snimanja objekta u bazu podataka

    Increment NHibernate generie vrednosti za primarni klju inkrementiranjem poslednje upotrebljene vrednosti. Koristi se samo u

    situacijama kada jedna aplikacija upisuje podatke u tabelu baze podataka.

    Identity podrka za Identity kolone kod DB2, MySQL, MS SQL Server iSybase baza podataka.

    Sequence podrka za generisanje vrednosti primarnih kljueva korienjem sekvenci kod DB2, PostgreSQL i Oracle baza podataka. Prilikom upisivanja

    objekta u bazu podata izvravaju se dve SQL naredbe: jedna koja pribavlja

    primarni klju i druga INSER naredba.

    TriggerIdentity baza podataka sama generie vrednost primarnog kljua korienjem BEFORE INSERT trigera

    Guid koristi se System.Guid za generisanje vrednosti primarnog kljua

    GuidNative koristi se GUID generator baze podataka za generisanje vrednosti primarnog kljua. Kao i kod sekvenci neophodne su dve SQL naredbe.

    Sistemi baza podataka

  • 22

    0Mapiranja

    Map - metoda koja definie mapiranja izmeu atributa domenske klase i kolona relacione baze podataka.

    Map(x => x.NazivProdavnice);

    U primeru je dati najednostavniji oblik poziva Map metode.

    Podrazumeva da atribut domenske klase i kolona u tabeli imaju isto

    ime.

    Map(x => x.NazivProdavnice)

    .Column("NAZIV");

    U prethodnom primeru ime atributa klase i ime kolone u tabeli se

    razlikuju pa je to neophodno eksplicitno specificirati.

    Sistemi baza podataka

  • 23

    0Mapiranja

    U veini sluajeva neophodno je obezbediti mapiranje veza izmeu

    entiteta.

    Fluent Nhibernate podrava mapiranje sledeih tipova relacija:

    many-to-one

    one-to-many

    many-to-many

    one-to-one

    Sistemi baza podataka

  • 24

    0Mapiranja

    References - metoda koja omoguava kreiranju meany-to-one relacija izmeu entiteta i primenjuje se na many strani.

    Kreira referencu na jedan entitet.

    U terminologiji baza podataka: tabela koja poseduje strani klju koji

    referencira primarni klju u nekoj drugoj tabeli.

    Za sluaj klasa Prodavnica i Odeljenje:class Prodavnica

    {

    }

    class Odeljenje

    {

    public virtual Prodavnica PripadaProdavnici{get; set;}

    }

    Sistemi baza podataka

  • 25

    0Mapiranja

    U klasi za mapiranje OdeljenjeMapiranja moe da se doda

    mapiranje oblika:

    References(x => x.PripadaProdavnici);

    U ovom sluaju se podrazumeva da u tabeli ODELJENJE postoji

    strani klju Prodavnica_id.

    Ukoliko je neophodno eksplicitno specificirati strani klju koristi se

    sledea notacija:

    References(x => x.PripadaProdavnici)

    .Column("BROJP")

    .LazyLoad();

    U prethodnom primery eksplicitno je specificirano i LazyLoad

    svojstvo mada je ono podrazumevano ponaanje.

    Sistemi baza podataka

  • 26

    0Mapiranja

    HasMany - metoda koja omoguava kreiranje one-to-many relacija izmeu domenskih entiteta.

    Nalazi se na one strani many-to-one relacije.

    Odgovara parent-child relaciji.

    Najee korieni tip relacija izmeu domenskih entiteta.

    Za sluaj klasa Prodavnica i Odeljenje:class Prodavnica

    {

    public virtual IList Odeljenja {get; set;}

    public Prodavnica()

    {

    Odeljenja = new List();

    }

    }

    Sistemi baza podataka

  • 27

    0Mapiranja

    U klasi ProdavnicaMapiranja moe da se doda mapiranje oblika:

    HasMany(x => x.Odeljenja);

    U ovom sluaju se podrazumeva da u tabeli ODELJENJE postoji

    strani klju Prodavnica_id.

    Ukoliko je neophodno eksplicitno specificirati strani klju koristi se

    sledea notacija:

    HasMany(x => x.Odeljenja)

    .KeyColumn("BROJP");

    LazyLoad svojstvo je podrazumevano. Ukoliko treba da se iskljui

    koristi se sledea notacija.

    HasMany(x => x.Odeljenja)

    .KeyColumn("BROJP")

    .Not.LazyLoad();

    Sistemi baza podataka

  • 28

    0Mapiranja

    Primer korienja HasMany relacije:

    Sistemi baza podataka

  • 29

    0Mapiranje

    Primer povezivanje odeljenja sa prodavnicom. U ovom primeru

    nova prodavnica e biti snimljena u bazu podataka ali ne i odeljena

    koja su povezana sa njom.

    Sistemi baza podataka

  • 30

    0Mapiranja

    Da bi se obezbedilo da se sva odeljenja iz kolekcije snime zajedno

    sa prodavnicom kojoj pripadaju potrebno je ukljuiti Cascade

    svojstvo HasMany veze.

    HasMany(x => x.Odeljenja)

    .KeyColumn("BROJP")

    .Cascade.All();

    Svojstvo Cascade specificira da li e se akcije nad roditeljeme

    (vlasnikom kolekcije) preneti na decu (elemente kolekcije). Neke

    od moguih vrednosti:

    All prenose se sve akcije

    Delete brisanje roditelja dovodi do brisanja dece

    SaveUpdate prenose se samo Save i Update akcije

    Sistemi baza podataka

  • 31

    0Mapiranja

    Kod ovakvih sluajeva treba voditi rauna o redosledu operacija

    prilikom snimanja objekata u bazu podataka.

    U ovom sluaju redosled operacija je sledei:

    1. Snima se roditelj i definie se vrednost njegovog primarnog kljua.

    2. Snimaju deca (lanovi kolekcije) kod kojih se vrednost stranog kljua postavi na

    NULL.

    3. Odradi se dodatni UPDATE koji za decu definie vrednost stranog kljua.

    Ovakav pristup moe da dovede do naruavanja ogranienja baze

    podataka. To posebno vai za situaciju gde je za kolonu stranog

    kljua postavljeno ogranienje NOT NULL. U tom sluaju drugi

    korak obavezno dovodi do pojave greke.

    Sistemi baza podataka

  • 32

    0Mapiranja

    U tim sluajevima se definie Inverse svojstvo HasMany relacije.

    HasMany(x => x.Odeljenja)

    .KeyColumn("BROJP")

    .Inverse()

    .Cascade.All();

    U ovom sluaju se naglaava da je druga strana one-to-many relacije

    u obavezi da odrava relaciju. Na taj nain NHibernate zna da

    najpre mora da snimi objekat roditelja pa tek nakon toga objekte

    decu.

    Sistemi baza podataka

  • 33

    0Mapiranja

    Za sluaj ukljuenog Inverse svojstva redosled operacija je sledei:

    o.PripadaProdavnici = p;

    o1.PripadaProdavnici = p;

    p.Odeljenja.Add(o);

    p.Odeljenja.Add(o1);

    s.Save(p);

    Sistemi baza podataka

  • 34

    0Mapiranja

    Ukoliko se ne koriste Cascade i Inverse svojstva HasMany relacije

    korisnik je u obavezi da sam obezbedi pravilan redosled snimanja

    objekata.

    s.Save(p);

    o.PripadaProdavnici = p;

    s.Save(o);

    o1.PripadaProdavnici = p;

    s.Save(o1);

    p.Odeljenja.Add(o);

    p.Odeljenja.Add(o1);

    Sistemi baza podataka

  • 35

    0Mapiranja

    Kod NHibernate relacija za specificiranje kolekcija obavezno je

    korienje interfejsa:

    System.Collections.IEnumerable

    System.Collections.ICollection

    System.Collections.IList

    System.Collections.IDictionary

    System.Collections.Generic.IEnumerable

    System.Collections.Generic.ICollection

    System.Collections.Generic.IList

    System.Collections.Generic.IDictionary

    System.Collections.Generic.ISet

    Svaka kolekcija zahteva inicijalizaciju pre korienja.

    Sistemi baza podataka

  • 36

    0Mapiranja

    HasManyToMany metoda koja omoguava mapiranjemany-to-many veza izmeu domenskih klasa.

    Funkcionie na slian nain kao i HasMany metoda, pri emu treba

    voditi rauna da je odgovarajua struktura u bazi podataka potpuno

    drugaija (strani klju kod HasMany relacije u odnosu na dodatnu

    tabelu kod HasManyToMany relacije).

    Sistemi baza podataka

  • 37

    0Mapiranja

    Primer deo baze podataka Lanac prodavnica igraaka

    Sistemi baza podataka

  • 38

    0Mapiranja

    Sistemi baza podataka

  • 39

    0Mapiranja

    Sistemi baza podataka

  • 40

    0Mapiranja

    HasManyToMany(x => x.Prodavnice)

    Prethodni oblik mapiranja podrazumeva postojanje tabele

    ProdavnicaToRadnik koja poseduje dve kolone Radnik_id i

    Prodavnica_id.

    Za eksplicitno specificiranje naziva tabele i odgovarajuih kolona

    koristi se sledei oblik:

    HasManyToMany(x => x.Prodavnice)

    .Table("RADI_U")

    .ParentKeyColumn("JBR_RADNIK")

    .ChildKeyColumn("BROJP");

    Sistemi baza podataka

  • 41

    0Mapiranja

    Na slian nain HasManyToMany relacija moe da se definie i na

    drugoj strani:

    public virtual IList Radnici { get; set; }

    HasManyToMany(x => x.Radnici)

    .Table("RADI_U")

    .ParentKeyColumn("BROJP")

    .ChildKeyColumn("JBR_RADNIK")

    .Inverse()

    .Cascade.All();

    Sistemi baza podataka

  • 42

    0Mapiranja

    Sistemi baza podataka

  • 43

    0Mapiranja

    Sistemi baza podataka

  • 44

    0Mapiranja

    Komplikovaniji sluaj kod koga tabela RADI_U poseduje dodatne

    kolone.

    Neophodno je kreirati poseban domenski entitet RadiU koji ima

    kompozitni Id.

    Klase Radnik i Prodavnica e imati one-to-many vezu ka

    domenskom entitetu RadiU.

    Sistemi baza podataka

  • 45

    0Mapiranja

    CompositeId metoda koja omoguava mapiranje kompozitnih kljeva.

    Za potrebe mapiranja kompozitnog kljua potrebno je napraviti

    posebnu domensku klasu koja poseduje sve atribute kompozitnog

    kljua i definie metode Equals i GetHashCode.

    CompositeId poseduje dva svojstva:

    KeyProperty atribut primarnog kljua predstavlja vrednost

    KeyReference - atribut primarnog kljua predstavlja referencu na neki domenski entitet

    Sistemi baza podataka

  • 46

    0Mapiranja

    Primer klase koja predstavlja kompozitni klju

    Sistemi baza podataka

  • 47

    0Mapiranja

    Sistemi baza podataka

  • 48

    0Mapiranja

    Sistemi baza podataka

  • 49

    0Mapiranja

    Obino se dodaju i HasMany mapiranja u klasi Radnik i Prodavnica.

    Za sluaj klase Radnik:

    public virtual IList RadiUProdavnice { get; set; }

    HasMany(x => x.RadiUProdavnice)

    .KeyColumn("JBR_RADNIK")

    .Cascade.All()

    .Inverse();

    Sistemi baza podataka

  • 50

    0Mapiranja

    HasOne metoda koja omoguava mapiranje specijalnog sluaja relacije izmeu domenskih klasa.

    Umesto HasOne relacije najee se koristi References (many-to-

    one) relacija.

    Sistemi baza podataka

  • 51

    0Mapiranja

    Sistemi baza podataka

  • 52

    0Mapiranja

    Prilikom mapiranja nasleivanja FluentNHibernate podrava dve

    strategije:

    Table-per-Class-Hierarchy (Table-pet-Hierarchy)

    Table-per-Class (Table-per-Type)

    Table-per-Concrete-Class

    Primer: http://www.codeproject.com/Articles/232034/Inheritance-

    mapping-strategies-in-Fluent-Nhibernat

    Sistemi baza podataka

  • 53

    0Mapiranja

    Primer: deo EER modela baze podataka Lanac prodavnica igraaka

    Sistemi baza podataka

  • 54

    0Mapiranja

    Primer: Deo relacionog modela baze podataka Lanac prodavnica

    igraaka

    Sistemi baza podataka

  • 55

    0Mapiranja

    Za prevoenje entiteta ODELJENJE i njegovih podklasa iskoriena

    je alternativa 8A i kompletna hijerarhija klasa je svedena na jednu

    tabelu tabelu ODELJENJE.

    Za mapiranje ovakve strukture Fluent NHibernate koristi strategiju

    Table-per-Hierarchy.

    Nadklasa Odeljenje se mapira na uobiajeni nain.

    Dodatak je metoda

    DiscriminateSubClassesOnColumn koja definiekolonu (predikat) ija vrednost odreuje pripadnost konkretnoj

    podklasi.

    Za sluaj tabele ODELJENJE, kolona TIP definie o kom tipu

    odeljenja se radi odnosno kojoj podklasi odeljenje pripada.

    Sistemi baza podataka

  • 56

    0Mapiranja

    Sistemi baza podataka

  • 57

    0Mapiranja

    Za svaku podklasu se kreira posebna domenska klasa koja je

    izvedena iz osnovne klase.

    U konkretnom sluaju bie kreirane domenske klase:

    OdeljenjeDo5, OdeljenjeOd6Do15 i OdeljenjeOdrasli. Ove

    domenske klase su izvedene iz klase Odeljenje.

    Prilikom mapiranja podklasa, klasa za mapiranje se izvodi iz Fluent

    NHibernate klase SubclassMap.

    Za svaku podklasu se metodom DiscriminatorValue definie

    vrednost kolone (kolona je definisana u nadklasi) koja odreuje da

    vrsta tabele pripada odreenom tipu.

    U konkretnom sluaju vrednost kolone TIP odreuje pripadnost

    podklasi na sledei nain:

    DO5 - pripadaju tipu OdeljenjeDo5

    OD6DO15 - pripadaju tipu OdeljenjeOd6Do15

    ODRASLI - pripadaju tipu OdeljenjeOdrasli

    Sistemi baza podataka

  • 58

    0Mapiranja

    Ukoliko podklase poseduju dodatne kolone, one se mapiraju na

    standardni nain.

    Poto svako odeljenje pripada jednom od tri navedena tipa, klasa

    Odeljenje moe da se definie kao apstraktna klasa.

    Sistemi baza podataka

  • 59

    0Mapiranja

    Sistemi baza podataka

  • 60

    0Mapiranja

    Sistemi baza podataka

  • 61

    0Mapiranja

    Sistemi baza podataka

  • 62

    0Mapiranja

    Primer: Podklasa Sef

    Sistemi baza podataka

  • 63

    0Mapiranja

    Primer: Podklasa Sef

    Sistemi baza podataka

  • 64

    0Mapiranja

    Primer: Podklasa Sef

    Sistemi baza podataka

  • 65

    0Mapiranja

    Primer: deo EER modela za bazu podataka Lanac

    prodavnica igraaka

    Sistemi baza podataka

  • 66

    0Mapiranja

    Primer: Deo relacionog modela baze podataka Lanac

    prodavnica igraaka

    Sistemi baza podataka

  • 67

    0Mapiranja

    Za prevoenje entiteta PROIZVOD i njegovih podklasa iskoriena je alternativa 8c i hijerarhija klasa je prevedena tako da svakoj podklasi odgovara jedna tabela u relacionoj bazi

    podataka.

    Za mapiranje ovakve strukture Fluent NHibernate koristi strategiju Table-per-Class.

    Nadklasa Proizvod se mapira na uobiajeni nain.

    Sistemi baza podataka

  • 68

    0Mapiranja

    Sistemi baza podataka

  • 69

    0Mapiranja

    Za svaku podklasu se kreira posebna domenska klasa koja je

    izvedena iz osnovne klase.

    U konkretnom sluaju bie kreirane domenske klase:

    IgrackaPlastika, Lutka, DodatakLutka, Automobil, Vojnik, Sagalica.

    Ove domenske klase su izvedene iz klase Proizvod.

    Prilikom mapiranja podklasa, klasa za mapiranje se izvodi iz Fluent

    NHibernate klase SubclassMap.

    Metoda KeyColumn specificira primarni klju podklase koji jeistovremeno i strani klju koji referencira nadklasu.

    Sistemi baza podataka

  • 70

    0Mapiranja

    Sistemi baza podataka

  • 71

    0Mapiranja

    Sistemi baza podataka

  • 72

    0Mapiranja

    Sistemi baza podataka

  • 73

    0Mapiranja

    Ukoliko se za prevoenje entiteta PROIZVOD i njegovih podklasaiskoristi alternativa 8B, ne postoji posebna tabela za nadklasu doksvaka podklasa dobija posebnu tabelu.

    Za mapiranje ovakve strukture Fluent NHibernate korististrategiju Table-per-Concrete-Class.

    U naem primeru ne bi vie postojala tabela PROIZVOD, dok bi

    postojale tabele koja odgovaraju podklasama koje bi nasledile sve

    kolone entiteta PROIZVOD.

    Sistemi baza podataka

  • 74

    0Mapiranja

    Sistemi baza podataka

  • 75

    0Mapiranja

    Sistemi baza podataka

  • 76

    0Mapiranja

    Mapiranja nadklasa i podklasa su izuzetno problematina.

    Treba izbegavati podklasa koje nemaju dodatna svostva.

    Primer: Nema potrebe uvoditi posebne domenske podklase za

    klasu Odeljenje.

    Primer: Namerno je izostavljena specijalizacija klase Vojnik po tipu

    materijala. Mogua je, ali nema previe smisla u praktinoj realizaciji.

    Primer: Uvoenje podklase ef zavisi od konkretnog reenja. Ima

    dodatno svojstvo koje je spcifino samo za efove.

    Zbog nedostatka podrke za viestruko nasleivanje nije mogue

    implementirati deljive podklase.

    Ne postoji posebna podrka za implementaciju kategorija.

    Kategorije se implementiraju korienjem References i/ili HasOne

    relacija.

    Sistemi baza podataka

  • 77

    0Mapiranja

    Za implementaciju deljive specijalizacije koristi se specijalni oblik

    DiscriminateSubClassesOnColumn metode.

    DiscriminateSubClassesOnColumn("")

    .Formula("predikat")

    Pri tome predikat ima oblik

    CASE WHEN (METAL_FLAG = 'Da' AND PLASTIKA_FLAG = 'Ne' ) THEN 'Metal'

    WHEN (METAL_FLAG = 'Ne' AND PLASTIKA_FLAG = 'Da' ) THEN 'Plastika'

    WHEN (METAL_FLAG = 'Da' AND PLASTIKA_FLAG = 'Da' ) THEN

    'MetalPlastika'

    ELSE 'Nepoznato'

    END

    Sistemi baza podataka

  • 78

    0Mapiranja

    ComponentMap metoda koja specificira mapiranje komponente koaj se esto javlja kod domenskih entiteta.

    Sistemi baza podataka

  • 79

    0Mapiranja

    Sistemi baza podataka