Programavimas

Pradėkite nuo užmigdymo režimo

Gerai suprasti, kad „Java“ programose reikalingas objektų / reliacijų atvaizdavimas (ORM), tačiau tikriausiai norėtumėte pamatyti, kaip veikia užmigdymo režimas. Pradėsime nuo paprasto pavyzdžio, parodančio tam tikrą jo galią.

Kaip jūs tikriausiai žinote, įprasta, kad programavimo knyga pradedama „Sveikas pasaulis“ pavyzdžiu. Šiame skyriuje mes laikomės tos tradicijos, pristatydami „Hibernate“ su gana paprasta „Hello World“ programa. Tačiau norint išsiaiškinti užmigdymo būseną, nepakaks paprasčiausiai išspausdinti pranešimą į konsolės langą. Vietoj to, mūsų programa išsaugos naujai sukurtus objektus duomenų bazėje, atnaujins juos ir atliks užklausas, kad gautų juos iš duomenų bazės.

Be kanoninio „Hello World“ pavyzdžio, pristatome pagrindines „Hibernate“ API ir pateikiame išsamią informaciją apie pagrindinę konfigūraciją.

„Sveikas pasaulis“ su užmigdymo režimu

Miego režimo programos apibrėžia nuolatines klases, kurios yra „susietos“ su duomenų bazės lentelėmis. Mūsų „Sveikas pasaulis“ pavyzdį sudaro viena klasė ir vienas susiejimo failas. Pažiūrėkime, kaip atrodo paprasta nuolatinė klasė, kaip nurodomas susiejimas ir kai kuriuos dalykus, kuriuos galime padaryti su nuolatinės klasės egzemplioriais, naudojant „hibernate“.

Mūsų pavyzdinės programos tikslas yra saugoti pranešimus duomenų bazėje ir gauti juos rodyti. Programa turi paprastą patvarią klasę, Pranešimas, kuris reiškia šiuos spausdintinus pranešimus. Mūsų Pranešimas klasė rodoma 1 sąraše.

Sąrašas 1. Message.java: paprasta nuolatinė klasė

paketas labas; public class Pranešimas {private Long id; privati ​​eilutės tekstas; asmeninis pranešimas nextMessage; asmeninis pranešimas () {} viešasis pranešimas (eilutės tekstas) {this.text = text; } public Long getId () {return ID; } private void setId (ilgas ID) {this.id = id; } public String getText () {return text; } public void setText (String text) {this.text = text; } public message getNextMessage () {return nextMessage; } public void setNextMessage (Pranešimas nextMessage) {this.nextMessage = nextMessage; }} 

Mūsų Pranešimas klasėje yra trys atributai: identifikatoriaus atributas, pranešimo tekstas ir nuoroda į kitą Pranešimas. Identifikatoriaus atributas leidžia programai pasiekti nuolatinio objekto duomenų bazės tapatybę - pirminio rakto vertę. Jei du atvejai Pranešimas turi tą pačią identifikatoriaus vertę, jie reiškia tą pačią duomenų bazės eilutę. Mes pasirinkome Ilgas identifikatoriaus atributo tipui, tačiau tai nėra reikalavimas. Miego režimas leidžia praktiškai bet kokį identifikatoriaus tipą, kaip pamatysite vėliau.

Galbūt pastebėjote, kad visi Pranešimas klasėje yra „JavaBean“ stiliaus nuosavybės prieigos metodai. Klasėje taip pat yra konstruktorius be jokių parametrų. Atkaklios klasės, kurias naudojame savo pavyzdžiuose, beveik visada atrodys maždaug taip.

Egzempliorius Pranešimas klasę gali valdyti (paversti nuolatine) Hibernate, bet jie to nedaro turėti būti. Kadangi Pranešimas objektas neįdiegia jokių „Hibernate“ specifinių klasių ar sąsajų, mes galime ją naudoti kaip ir bet kurią kitą „Java“ klasę:

Pranešimo pranešimas = naujas pranešimas („Labas pasaulis“); System.out.println (message.getText ()); 

Šis kodo fragmentas daro tiksliai tai, ko tikėjomės iš „Hello World“ programų: spausdina "Labas pasauli" į konsolę. Gali atrodyti, kad mes čia bandome būti mieli; Tiesą sakant, mes parodome svarbų bruožą, kuris išskiria „Hibernate“ nuo kai kurių kitų patvarumo sprendimų, pavyzdžiui, „EJB“ („Enterprise JavaBean“) pupelių. Mūsų nuolatinė klasė gali būti naudojama bet kokiame vykdymo kontekste - nereikia specialaus konteinerio. Žinoma, jūs atėjote čia pačiam pažiūrėti, kaip užmigdyti, todėl išsaugokime naują Pranešimas į duomenų bazę:

Seanso sesija = getSessionFactory (). OpenSession (); Operacija tx = session.beginTransaction (); Pranešimo pranešimas = naujas pranešimas („Labas pasaulis“); session.save (žinutė); tx.commit (); sesija.uždaryti (); 

Šis kodas iškviečia hibernatą Sesija ir Sandoris sąsajos. (Mes tai pasieksime „getSessionFactory“ () netrukus.) Dėl to bus vykdoma kažkas panašaus į šį SQL:

įterpti į MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID) reikšmes (1, „Hello World“, null) 

Laikykis MESSAGE_ID stulpelis inicijuojamas iki keistos vertės. Mes nenustatėme id nuosavybė pranešimą bet kur, todėl tikėtumėmės niekinis, tiesa? Tiesą sakant, id nuosavybė yra ypatinga: tai yra identifikatoriaus ypatybė- ji turi sukurtą unikalią vertę. (Vėliau aptarsime, kaip sukuriama vertė.) Vertė priskiriama Pranešimas Hibernate, kai sutaupyti() vadinamas.

Šiame pavyzdyje manome, kad PRANEŠIMAI lentelė jau yra. Žinoma, norime, kad programa „Sveikas pasaulis“ atspausdintų pranešimą į konsolę. Dabar, kai duomenų bazėje turime pranešimą, esame pasirengę tai parodyti. Kitas pavyzdys pateikia visus pranešimus iš duomenų bazės abėcėlės tvarka ir juos išspausdina:

Session newSession = getSessionFactory (). OpenSession (); Operacija newTransaction = newSession.beginTransaction (); Išvardyti pranešimus = newSession.find ("from Message as m order by m.text asc"); System.out.println (messages.size () + "rastas pranešimas (-ai):"); for (Iterator iter = žinutės.iterator (); iter.hasNext ();) {Pranešimo pranešimas = (Žinutė) iter.next (); System.out.println (message.getText ()); } newTransaction.commit (); newSession.close (); 

Pažodinė eilutė "from Message as m order by m.text asc" yra užmigdymo užklausa, išreikšta paties „Hibernate“ į objektą orientuota Hibernate Query Language (HQL) kalba. Ši užklausa yra išversta į šią SQL, kai rasti () vadinamas:

pasirinkite m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID iš MESSAGES m tvarka pagal m.MESSAGE_TEXT asc 

Kodo fragmentas spausdinamas:

Rasta 1 žinutė (-ių): Hello World 

Jei dar niekada nenaudojote tokio ORM įrankio kaip „Hibernate“, tikriausiai tikėjotės pamatyti SQL sakinius kažkur kode ar metaduomenyse. Jų nėra. Visa SQL sukuriama vykdymo metu (faktiškai paleidžiant, visiems daugkartinio naudojimo SQL sakiniams).

Kad ši magija atsirastų, hibernatei reikia daugiau informacijos apie tai, kaip Pranešimas klasė turėtų būti patvari. Ši informacija paprastai pateikiama XML susiejimo dokumentas. Žemėlapio dokumente, be kita ko, apibrėžta, kaip Pranešimas klasės žemėlapis į PRANEŠIMAI stalo. Pažvelkime į 2 sąrašo žemėlapio dokumentą.

Sąrašas 2. Paprastas hibernate XML susiejimas

Kartografavimo dokumente Hibernatei nurodoma, kad Pranešimas klasė turi būti atkakli PRANEŠIMAI lentelę, kad ypatybės identifikatorius susiejamas su stulpeliu, pavadintu MESSAGE_ID, kad teksto ypatybė susiejama su stulpeliu, pavadintu MESSAGE_TEXTir kad turtas pavadintas kitasPasirašymas yra asociacija su daugybei daugybei kad susieti su stulpeliu pavadinimu NEXT_MESSAGE_ID. (Kol kas nesijaudinkite dėl kitų detalių.)

Kaip matote, XML dokumentą nėra sunku suprasti. Galite lengvai parašyti ir prižiūrėti rankomis. Nepriklausomai nuo pasirinkto metodo, hibernate yra pakankamai informacijos, kad būtų galima visiškai sugeneruoti visus SQL sakinius, kurių reikėtų norint įterpti, atnaujinti, ištrinti ir nuskaityti Pranešimas klasė. Nebereikia šių SQL sakinių rašyti ranka.

Pastaba
Daugelis „Java“ kūrėjų skundėsi „metaduomenų pragaru“, kuris lydi J2EE kūrimą. Kai kurie siūlo perkelti nuo XML metaduomenų atgal į paprastą „Java“ kodą. Nors mes pritariame šiam pasiūlymui dėl kai kurių problemų, ORM yra atvejis, kai teksto metaduomenys tikrai yra būtini. Hibernate turi protingus numatytuosius nustatymus, kurie sumažina spausdinimą, ir subrendusį dokumento tipo apibrėžimą, kurį galima naudoti automatiškai užpildant ar patvirtinant redaktoriuose. Jūs netgi galite automatiškai generuoti metaduomenis naudodami įvairius įrankius.

Dabar pakeiskime savo pirmąjį pranešimą ir, kol mes jį parengsime, sukurkime naują pranešimą, susietą su pirmuoju, kaip parodyta 3 sąraše.

Sąrašas 3. Pranešimo atnaujinimas

Seanso sesija = getSessionFactory (). OpenSession (); Operacija tx = session.beginTransaction (); // 1 yra sugeneruotas pirmojo pranešimo ID Message message = (Message) session.load (Message.class, new Long (1)); message.setText („Sveikinimai žemiečiui“); Pranešimas nextMessage = naujas pranešimas ("Nuvesk mane pas savo vadovą (prašau)"); message.setNextMessage (nextMessage); tx.commit (); sesija.uždaryti (); 

Šis kodas toje pačioje operacijoje iškviečia tris SQL sakinius:

pasirinkite m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID iš MESSAGES m, kur m.MESSAGE_ID = 1 įterpti į MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID) reikšmes (2, 'Take me to your leader (please)', null) atnaujinti MESSAGES nustatyti MESSAGE_TEXT = 'Sveikinimai, žemaičiai', NEXT_MESSAGE_ID = 2, kur MESSAGE_ID = 1 

Atkreipkite dėmesį, kaip užmigdymo būsena aptiko modifikaciją tekstas ir kitasPasirašymas pirmojo pranešimo ypatybes ir automatiškai atnaujino duomenų bazę. Mes pasinaudojome „Hibernate“ funkcija, vadinama automatinis nešvarus tikrinimas: ši funkcija taupo mūsų pastangas aiškiai paprašyti hibernato atnaujinti duomenų bazę, kai mes modifikuojame objekto būseną operacijos metu. Panašiai galite pamatyti, kad naujas pranešimas buvo pastovus, kai buvo sukurta nuoroda iš pirmojo pranešimo. Ši funkcija vadinama kaskadinis išsaugojimas: tai taupo mūsų pastangas aiškiai padaryti naują objektą nuolatinį skambinant sutaupyti(), jei tik tai pasiekia jau patvarus egzempliorius. Taip pat atkreipkite dėmesį, kad SQL sakinių eilės tvarka nėra tokia pati kaip tvarka, kuria nustatome ypatybių vertes. Hibernate naudoja sudėtingą algoritmą, kad nustatytų efektyvų užsakymą, kuris išvengtų duomenų bazės svetimų raktų suvaržymų pažeidimų, tačiau vis tiek būtų pakankamai nuspėjamas vartotojui. Ši funkcija vadinama sandorio nurašymas.

Jei vėl paleisime „Sveikas pasaulis“, jis spausdina:

Rasta 2 žinutės (-ių): Sveikinimai, žemiečiai, nuvežk mane pas savo vadovą (prašau) 

Tai yra tiek, kiek mes imsimės „Hello World“ programos. Dabar, kai pagaliau turime šiek tiek kodą po diržu, žengsime žingsnį atgal ir pateiksime pagrindinių „Hibernate“ API apžvalgą.

Suprasti architektūrą

Programavimo sąsajos yra pirmas dalykas, kurį turite sužinoti apie užmigdymo režimą, kad galėtumėte jį naudoti savo programos patvarumo sluoksnyje. Pagrindinis API projektavimo tikslas yra išlaikyti kuo siauresnes sąsajas tarp programinės įrangos komponentų. Tačiau praktikoje ORM API nėra ypač mažos. Vis dėlto nesijaudink; jūs neturite suprasti visų „Hibernate“ sąsajų vienu metu. Žemiau pateiktame paveikslėlyje pavaizduoti svarbiausių užmigdymo sąsajų vaidmenys versle ir atkaklumo sluoksniai.

Mes parodome verslo sluoksnį virš patvarumo sluoksnio, nes verslo sluoksnis tradiciškai sluoksniuotoje programoje veikia kaip patvarumo sluoksnio klientas. Atminkite, kad kai kurios paprastos programos gali visiškai neatskirti verslo logikos nuo patvarumo logikos; tai gerai - tai tik supaprastina schemą.

Hibernate sąsajos, parodytos aukščiau esančiame paveikslėlyje, gali būti maždaug klasifikuojamos taip:

  • Sąsajos, kurias programos pakviečia atlikti pagrindinėms CRUD (sukurti / skaityti / atnaujinti / ištrinti) ir užklausų operacijoms atlikti. Šios sąsajos yra pagrindinis programų verslo / valdymo logikos priklausomybės nuo užmigdymo būsenos taškas. Jie įtraukia Sesija, Sandorisir Užklausa.
  • Sąsajos, vadinamos programos infrastruktūros kodu, norint sukonfigūruoti užmigdymo režimą, svarbiausia Konfigūracija klasė.
  • Perskambink sąsajos, leidžiančios programai reaguoti į įvykius, vykstančius užmigdymo režime, pvz Perėmėjas, Gyvenimo ciklasir Patvirtinama.
  • Sąsajos, leidžiančios išplėsti galingą užmigdymo režimo atvaizdavimo funkciją, pvz „UserType“, „CompositeUserType“ir IdentifierGenerator. Šios sąsajos įgyvendinamos taikant infrastruktūros kodą (jei reikia).

Hibernate naudoja esamas „Java“ API, įskaitant JDBC („Java Database Connectivity“), „Java Transaction API“ (JTA) ir „Java Naming and Directory Interface“ (JNDI). JDBC suteikia elementarų funkcijų abstrakcijos lygį, būdingą reliacinėms duomenų bazėms, todėl beveik bet kurią duomenų bazę su JDBC tvarkykle palaiko „Hibernate“. JNDI ir JTA leidžia užmigdymo režimą integruoti į J2EE programų serverius.

Šiame skyriuje mes nenagrinėjame išsamios „Hibernate“ API metodų semantikos, o tik kiekvienos iš pagrindinių sąsajų vaidmens. Daugumą šių sąsajų galite rasti pakete net.sf.šventinti. Trumpai apžvelkime kiekvieną sąsają iš eilės.

Pagrindinės sąsajos

Penkios pagrindinės sąsajos naudojamos beveik kiekvienoje „Hibernate“ programoje. Naudodamiesi šiomis sąsajomis, galite laikyti ir gauti nuolatinius objektus bei valdyti operacijas.

Sesijos sąsaja

$config[zx-auto] not found$config[zx-overlay] not found