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_TEXT
ja 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
,Kauppa
jaKysely
. - 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ä
,Elinkaari
jaVahvistettavissa
. - Liitännät, jotka mahdollistavat horrostilan tehokkaan kartoitustoiminnon, kuten
Käyttäjätyyppi
,CompositeUserType
jaIdentifierGenerator
. 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ä