Ohjelmointi

Aloita horrostilan käyttö

On hyvä ymmärtää kohteen / relaatiokartoituksen (ORM) tarve Java-sovelluksissa, mutta olet todennäköisesti innokas nähdä horrostilan toiminnassa. Aloitamme näyttämällä sinulle yksinkertaisen esimerkin, joka osoittaa osan sen voimasta.

Kuten olet todennäköisesti tietoinen, on perinteistä, että ohjelmointikirja alkaa "Hello World" -esimerkillä. Tässä luvussa noudatamme tätä perinnettä ottamalla horrostilan käyttöön suhteellisen yksinkertaisella "Hello World" -ohjelmalla. Pelkkä viestin tulostaminen konsoli-ikkunaan ei kuitenkaan riitä osoittamaan horrostilaa. Sen sijaan ohjelmamme tallentaa äskettäin luodut objektit tietokantaan, päivittää ne ja suorittaa kyselyitä niiden hakemiseksi tietokannasta.

Kanonisen "Hello World" -esimerkin lisäksi esittelemme keskeiset horrostilan sovellusliittymät ja annamme yksityiskohdat perusmäärityksistä.

"Hei maailma" horrostilan kanssa

Lepotilassa olevat sovellukset määrittelevät pysyvät luokat, jotka "yhdistetään" tietokantataulukoihin. "Hello World" -esimerkki koostuu yhdestä luokasta ja yhdestä kartoitustiedostosta. Katsotaanpa, miltä yksinkertainen pysyvä luokka näyttää, miten kartoitus määritetään ja joitain asioita, joita voimme tehdä pysyvän luokan horrostilaa käyttävien esiintymien kanssa.

Esimerkkisovelluksemme tarkoituksena on tallentaa viestit tietokantaan ja noutaa ne näytettäväksi. Sovelluksella on yksinkertainen pysyvä luokka, Viesti, joka edustaa näitä tulostettavia viestejä. Meidän Viesti luokka näkyy luettelossa 1.

Listaus 1. Message.java: Yksinkertainen pysyvä luokka

hei paketti; public class Viesti {private Long id; yksityinen merkkijono teksti; yksityisviesti nextMessage; yksityisviesti () {} julkinen viesti (merkkijono) {this.text = text; } public Long getId () {return ID; } private void setId (pitkä id) {this.id = id; } public String getText () {return text; } public void setText (String text) {this.text = text; } julkinen viesti getNextMessage () {return nextMessage; } public void setNextMessage (Message nextMessage) {this.nextMessage = nextMessage; }} 

Meidän Viesti luokassa on kolme attribuuttia: tunniste-attribuutti, viestin teksti ja viittaus toiseen Viesti. Tunniste-määritteen avulla sovellus voi käyttää pysyvän objektin tietokantaidentiteettiä - ensisijaisen avaimen arvoa. Jos kaksi tapausta Viesti on sama tunniste-arvo, ne edustavat samaa tietokannan riviä. Olemme valinneet Pitkä tunniste-attribuuttimme tyypille, mutta tämä ei ole vaatimus. Horrostila sallii tunnistetyypille käytännössä kaiken, kuten näet myöhemmin.

Olet ehkä huomannut, että kaikki Viesti luokassa on JavaBean-tyylisiä ominaisuuskäyttömenetelmiä. Luokalla on myös konstruktori, jolla ei ole parametreja. Pysyvät luokat, joita käytämme esimerkeissä, näyttävät melkein aina tältä.

Esiintymät Viesti luokkaa voidaan hoitaa (tehdä pysyväksi) horrostilassa, mutta he eivät omistaa olla. Koska Viesti object ei toteuta mitään lepotilakohtaisia ​​luokkia tai rajapintoja, voimme käyttää sitä kuten mitä tahansa muuta Java-luokkaa:

Viestiviesti = uusi viesti ("Hello World"); System.out.println (viesti.getText ()); 

Tämä koodinpätkä tekee juuri sen, mitä olemme odottaneet "Hello World" -sovelluksilta: Se tulostaa "Hei maailma" konsoliin. Saattaa näyttää siltä, ​​että yritämme olla söpöjä täällä; itse asiassa esittelemme tärkeän ominaisuuden, joka erottaa horrostilan joistakin muista pysyvyysratkaisuista, kuten EJB (Enterprise JavaBean) -objektipapuista. Pysyvää luokkaa voidaan käyttää missä tahansa suoritusympäristössä - erityistä säilöä ei tarvita. Tietysti tulit tänne katsomaan itse lepotilaa, joten tallennetaan uusi Viesti tietokantaan:

Istunnon istunto = getSessionFactory (). OpenSession (); Transaction tx = session.beginTransaction (); Viestiviesti = uusi viesti ("Hello World"); session.save (viesti); tx.sitoumus (); session.close (); 

Tämä koodi soittaa horrostilaan Istunto ja Kauppa rajapinnat. (Saamme siihen getSessionFactory () soita pian.) Se johtaa jonkin seuraavan SQL: n kaltaisen suorittamiseen:

lisää MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID) -arvoihin (1, 'Hello World', null) 

Pidä kiinni MESSAGE_ID sarake alustetaan outoon arvoon. Emme asettaneet id Omaisuutta viesti missä tahansa, joten odotamme sen olevan tyhjä, eikö? Oikeastaan id omaisuus on erityinen: Se on identifier -ominaisuus- sillä on luotu yksilöllinen arvo. (Keskustelemme siitä, miten arvo luodaan myöhemmin.) Arvo määritetään Viesti esimerkiksi horrostilan aikana Tallentaa() kutsutaan.

Tässä esimerkissä oletetaan, että VIESTIT taulukko on jo olemassa. Tietenkin haluamme, että "Hello World" -ohjelma tulostaa viestin konsolille. Nyt kun meillä on viesti tietokannassa, olemme valmiita osoittamaan tämän. Seuraava esimerkki hakee kaikki viestit tietokannasta aakkosjärjestyksessä ja tulostaa ne:

Istunto newSession = getSessionFactory (). OpenSession (); Tapahtuma newTransaction = newSession.beginTransaction (); Luetteloviestit = newSession.find ("Viestistä m järjestyksessä m.text asc: n mukaan"); System.out.println (messages.size () + "löydetyt viestit:"); for (Iterator iter = viestit.iterator (); iter.hasNext ();) {Viestisanoma = (Viesti) iter.next (); System.out.println (viesti.getText ()); } newTransaction.commit (); newSession.close (); 

Kirjaimellinen merkkijono "viestistä m järjestyksessä m.text asc" on horrostila-kysely, joka ilmaistaan ​​horrostilan omalla objektisuuntautuneella horrostilan kyselykielellä (HQL). Tämä kysely käännetään sisäisesti seuraavaan SQL: ään, kun löytö() kutsutaan:

valitse m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID joukosta MESSAGES m järjestyksessä m.MESSAGE_TEXT asc 

Koodifragmentti tulostaa:

Löytyi 1 viesti (t): Hello World 

Jos et ole koskaan aiemmin käyttänyt ORM-työkalua, kuten Hibernate, odotit todennäköisesti näkevänne SQL-käskyt jonnekin koodissa tai metatiedoissa. He eivät ole siellä. Kaikki SQL luodaan ajon aikana (itse käynnistyksen yhteydessä kaikille uudelleenkäytettäville SQL-käskyille).

Jotta tämä taika voi tapahtua, horrostila tarvitsee lisätietoja siitä, miten Viesti luokan tulisi olla pysyvää. Nämä tiedot annetaan yleensä XML-kartoitusasiakirja. Kartoitusasiakirja määrittelee muun muassa kuinka Viesti luokan kartta sarakkeisiin VIESTIT pöytä. Tarkastellaan kartoitusasiakirjaa luettelossa 2.

Listaus 2. Yksinkertainen horrostilan XML-kartoitus

Kartoitusasiakirja kertoo horrostilalle, että Viesti luokka on jatkettava VIESTIT taulukko, että tunnisteominaisuus yhdistetään nimettyyn sarakkeeseen MESSAGE_ID, että tekstiominaisuus yhdistetään nimettyyn sarakkeeseen MESSAGE_TEXTja että nimetty kiinteistö seuraavaMessage on yhdistys monta yhteen-moninaisuus joka kartoittaa nimettyyn sarakkeeseen NEXT_MESSAGE_ID. (Älä välitä muista yksityiskohdista toistaiseksi.)

Kuten näette, XML-asiakirjaa ei ole vaikea ymmärtää. Voit helposti kirjoittaa ja ylläpitää sitä käsin. Valitusta menetelmästä riippumatta, horrostilassa on tarpeeksi tietoa kaikkien SQL-käskyjen luomiseksi, joita tarvitaan lisäämään, päivittämään, poistamaan ja noutamaan Viesti luokassa. Sinun ei enää tarvitse kirjoittaa näitä SQL-käskyjä käsin.

Merkintä
Monet Java-kehittäjät ovat valittaneet J2EE: n kehitykseen liittyvästä "metatietojen helvetistä". Jotkut ovat ehdottaneet siirtymistä pois XML-metatiedoista takaisin tavalliseen Java-koodiin. Vaikka kiitämme tätä ehdotusta joistakin ongelmista, ORM on tapaus, jossa tekstipohjaiset metatiedot ovat todella välttämättömiä. Lepotilassa on järkeviä oletusarvoja, jotka minimoivat kirjoittamisen, ja kypsä asiakirjatyypin määritelmä, jota voidaan käyttää automaattiseen täydennykseen tai validointiin muokkaustoiminnoissa. Voit jopa luoda metatiedot automaattisesti eri työkaluilla.

Vaihdetaan nyt ensimmäinen viesti ja, kun olemme siinä, luo uusi viesti, joka liittyy ensimmäiseen, kuten luettelossa 3 on esitetty.

Luettelointi 3. Viestin päivittäminen

Istunnon istunto = getSessionFactory (). OpenSession (); Transaction tx = session.beginTransaction (); // 1 on ensimmäisen viestin luoma tunnus Message message = (Message) session.load (Message.class, new Long (1)); message.setText ("Greetings Earthling"); Viesti nextMessage = uusi viesti ("Vie minut johtajan luo (kiitos)"); message.setNextMessage (seuraavaMessage); tx.sitoumus (); session.close (); 

Tämä koodi kutsuu kolme SQL-käskyä saman tapahtuman sisään:

valitse m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID ryhmästä MESSAGES m, jossa m.MESSAGE_ID = 1 lisää kohtaan MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID) arvot (2, 'Take me to your leader (please)', null) päivitä MESSAGES aseta MESSAGE_TEXT = 'Greetings Earthling', NEXT_MESSAGE_ID = 2 missä MESSAGE_ID = 1 

Huomaa, kuinka horrostila havaitsi muutoksen teksti ja seuraavaMessage ensimmäisen viestin ominaisuudet ja päivitti tietokannan automaattisesti. Olemme hyödyntäneet kutsuttua horrostilan ominaisuutta automaattinen likainen tarkistus: tämä ominaisuus säästää meitä pyrkimyksessä nimenomaisesti pyytää horrostilaa päivittämään tietokanta, kun muokkaamme tapahtuman sisällä olevan objektin tilaa. Vastaavasti voit nähdä, että uusi viesti tehtiin pysyväksi, kun viittaus luotiin ensimmäisestä viestistä. Tätä ominaisuutta kutsutaan CSS-tallennus: se säästää meitä pyrkimyksessä tehdä uusi esine pysyväksi soittamalla Tallentaa(), niin kauan kuin se on saavutettavissa jo pysyvällä instanssilla. Huomaa myös, että SQL-käskyjen järjestys ei ole sama kuin järjestys, jossa asetamme ominaisuusarvot. Lepotila käyttää kehittynyttä algoritmia tehokkaan järjestyksen määrittämiseen, joka välttää tietokannan ulkomaisen avaimen rajoitusten rikkomukset, mutta on silti riittävän ennakoitavissa käyttäjälle. Tätä ominaisuutta kutsutaan transaktiokirjoitus.

Jos suoritamme "Hello World" uudelleen, se tulostaa:

Löytyi 2 viestiä: Tervehdys Maanpäällinen vie minut johtajan luo (kiitos) 

Tämä on niin kauan kuin otamme "Hello World" -sovelluksen. Nyt kun meillä on vihdoin koodimme vyön alla, otamme askeleen taaksepäin ja esittelemme yleiskuvan Hibernaten tärkeimmistä sovellusliittymistä.

Arkkitehtuurin ymmärtäminen

Ohjelmointirajapinnat ovat ensimmäinen asia, joka sinun on opittava horrostilasta, jotta voit käyttää sitä sovelluksesi pysyvyyskerroksessa. API-suunnittelun päätavoitteena on pitää ohjelmistokomponenttien väliset rajapinnat mahdollisimman kapeina. Käytännössä ORM-sovellusliittymät eivät kuitenkaan ole erityisen pieniä. Älä huoli; sinun ei tarvitse ymmärtää kaikkia horrostilan käyttöliittymiä kerralla. Alla oleva kuva kuvaa tärkeimpien horrostilan rajapintojen roolit liike- ja pysyvyyskerroksissa.

Näytämme yrityskerroksen pysyvyyskerroksen yläpuolella, koska yrityskerros toimii pysyvyyskerroksen asiakkaana perinteisesti kerrostetussa sovelluksessa. Huomaa, että jotkut yksinkertaiset sovellukset eivät välttämättä erota liiketoimintalogiikkaa pysyvyyslogiikasta; se on okei - se vain yksinkertaistaa kaaviota.

Yllä olevassa kuvassa esitetyt lepotilan rajapinnat voidaan luokitella suunnilleen seuraavasti:

  • Liitännät, joita sovellukset kutsuvat suorittamaan CRUD-perustoiminnot (luominen / lukeminen / päivittäminen / poistaminen) ja kyselytoiminnot. Nämä rajapinnat ovat tärkein sovellusliiketoiminnan / ohjauslogiikan riippuvuus horrostilasta. Ne sisältävät Istunto, Kauppaja Kysely.
  • Liitännät, joita sovellusinfrastruktuurikoodi kutsuu horrostilan määrittämiseksi, mikä tärkeintä, Kokoonpano luokassa.
  • Soita takaisin käyttöliittymät, joiden avulla sovellus voi reagoida horrostilassa tapahtuviin tapahtumiin, kuten Torjuntahävittäjä, Elinkaarija Vahvistettavissa.
  • Liitännät, jotka mahdollistavat horrostilan tehokkaan kartoitustoiminnon, kuten Käyttäjätyyppi, CompositeUserTypeja IdentifierGenerator. Nämä rajapinnat toteutetaan sovellusinfrastruktuurikoodilla (tarvittaessa).

Hibernate käyttää olemassa olevia Java-sovellusliittymiä, mukaan lukien JDBC (Java Database Connectivity), Java Transaction API (JTA) ja Java Naming and Directory Interface (JNDI). JDBC tarjoaa relaatiotietokannoille yhteisen toiminnallisuuden alkeellisen tason, jolloin horrostila tukee melkein mitä tahansa JDBC-ohjainta sisältävää tietokantaa. JNDI ja JTA mahdollistavat horrostilan integroinnin J2EE-sovelluspalvelimiin.

Tässä osassa emme käsittele horrostilan API-menetelmien yksityiskohtaista semantiikkaa, vain kunkin ensisijaisen rajapinnan roolia. Suurin osa näistä rajapinnoista löytyy paketista net.sf. näyttää. Tarkastellaan lyhyesti kutakin käyttöliittymää vuorotellen.

Ydinliitännät

Viittä ydinliitäntää käytetään melkein kaikissa horrostilassa-sovelluksissa. Näiden rajapintojen avulla voit tallentaa ja hakea pysyviä objekteja ja hallita tapahtumia.

Istunnon käyttöliittymä