Spesifikaationa on Java Persistence -sovellusliittymä sitkeys, mikä tarkoittaa löyhästi mitä tahansa mekanismia, jolla Java-objektit elävät niitä luoneen sovellusprosessin ajan. Kaikkia Java-objekteja ei tarvitse säilyttää, mutta useimmat sovellukset säilyttävät tärkeimmät liiketoimintaobjektit. JPA-määrityksen avulla voit määrittää mikä esineiden tulisi olla pysyviä ja Miten nämä objektit tulisi säilyttää Java-sovelluksissa.
Itse asiassa yhteinen edustajakokous ei ole työkalu tai kehys; pikemminkin se määrittelee joukon käsitteitä, jotka voidaan toteuttaa millä tahansa työkalulla tai kehyksellä. Vaikka JPA: n objekti-relaatiokartoitus (ORM) -malli perustui alun perin horrostilaan, se on sittemmin kehittynyt. Samoin, vaikka JPA oli alun perin tarkoitettu käytettäväksi relaatio- / SQL-tietokantojen kanssa, joitain JPA-toteutuksia on laajennettu käytettäväksi NoSQL-tietokantojen kanssa. Suosittu kehys, joka tukee JPA: ta NoSQL: llä, on EclipseLink, JPA 2.2: n viitetoteutus.
JPA 2.2, Jakarta EE
Java Persistence -sovellusliittymä julkaistiin ensin EJB 3.0 -määrityksen (JSR 220) osajoukkona Java EE 5: ssä. Se on sittemmin kehittynyt omana teknisenä tietonsa alkaen JPA 2.0: n julkaisemisesta Java EE 6: ssa (JSR 317). Tämän kirjoituksen jälkeen JPA 2.2 on hyväksytty jatkettavaksi osana Jakarta EE: tä.
JPA ja horrostila
Hibernate ja JPA ovat keskenään kietoutuneen historiansa vuoksi usein sekoitettavissa. JPA on kuitenkin tuottanut monia yhteensopivia työkaluja ja kehyksiä, kuten Java Servlet -määritykset. Lepotila on vain yksi niistä.
Gavin Kingin kehittämä ja vuoden 2002 alussa julkaistu Hibernate on Java-ORM-kirjasto. King kehitti horrostilan vaihtoehtona entisöpapuille pysyvyydelle. Kehys oli niin suosittu ja niin tarvittu tuolloin, että monet sen ideoista hyväksyttiin ja kodifioitiin ensimmäisessä yhteisen parlamentaarisen edustajakokouksen määrittelyssä.
Horrostilan ORM on nykyään yksi kypsimmistä JPA-toteutuksista, ja edelleen suosittu vaihtoehto ORM: lle Java-ohjelmassa. Lepotilassa oleva ORM 5.3.8 (nykyinen versio tämän kirjoituksen jälkeen) toteuttaa JPA 2.2: n. Lisäksi Hibernate-työkalujen perhe on laajentunut sisällyttämällä siihen suosittuja työkaluja, kuten Hibernate Search, Hibernate Validator ja Hibernate OGM, joka tukee verkkotunnusmallin pysyvyyttä NoSQL: lle.
JPA ja EJB
Kuten aiemmin todettiin, JPA otettiin käyttöön EJB 3.0: n osajoukkona, mutta on sittemmin kehittynyt omana erittelynään. EJB on eritelmä, jonka painopiste on erilainen kuin JPA, ja se toteutetaan EJB-säilössä. Jokainen EJB-säiliö sisältää pysyvyyskerroksen, joka määritellään JPA-määrityksessä.
Mikä on Java ORM?
Vaikka ne eroavat toisistaan, jokainen JPA-toteutus tarjoaa jonkinlaisen ORM-kerroksen. JPA- ja JPA-yhteensopivien työkalujen ymmärtämiseksi sinulla on oltava hyvä käsitys ORM: stä.
Objektisuhdekartoitus on a tehtävä- kehittäjillä on hyvä syy välttää tekemästä manuaalisesti. Kehys, kuten Hibernate ORM tai EclipseLink, koodaa tehtävän kirjastoksi tai kehykseksi ORM-kerros. Osana sovellusarkkitehtuuria ORM-kerros on vastuussa ohjelmisto-objektien muuntamisen hallinnoinnista vuorovaikutuksessa relaatiotietokannan taulukkojen ja sarakkeiden kanssa. Java-tilassa ORM-kerros muuntaa Java-luokat ja -objektit siten, että ne voidaan tallentaa ja hallita relaatiotietokantaan.
Oletusarvon mukaan jatkuvan objektin nimestä tulee taulukon nimi ja kentistä sarakkeet. Kun taulukko on määritetty, kukin taulukon rivi vastaa sovelluksen kohdetta. Objektikartoitus on määritettävissä, mutta oletukset toimivat yleensä hyvin.
JPA ja NoSQL
Viime aikoihin asti ei-relaatiotietokannat olivat harvinaisia uteliaisuuksia. NoSQL-liike muutti kaiken tämän, ja nyt Java-kehittäjät voivat käyttää erilaisia NoSQL-tietokantoja. Jotkut JPA-toteutukset ovat kehittyneet kattamaan NoSQL: n, mukaan lukien Hibernate OGM ja EclipseLink.
Kuva 1 kuvaa JPA: n ja ORM-kerroksen roolia sovelluskehityksessä.
JavaWorld /Java ORM -tason määrittäminen
Kun määrität uuden projektin käyttämään JPA: ta, sinun on määritettävä tietovarasto ja JPA-palveluntarjoaja. Määrität a datastore-liitin muodostaa yhteys valitsemaasi tietokantaan (SQL tai NoSQL). Lisää ja määritä myös JPA-tarjoaja, joka on kehys, kuten horrostila tai EclipseLink. Vaikka voit määrittää JPA: n manuaalisesti, monet kehittäjät päättävät käyttää Springin valmiita tukia. Katso "JPA: n asennus ja asennus"alla esitellään sekä manuaalinen että jousipohjainen JPA-asennus ja -asennus.
Java-dataobjektit
Java Data Objects on standardoitu pysyvyyskehys, joka eroaa JPA: sta ensisijaisesti tukemalla objektin pysyvyyslogiikkaa ja sen pitkäaikaista tukea ei-relaatiotietovarastojen kanssa työskentelylle. JPA ja JDO ovat riittävän samanlaisia, että JDO: n tarjoajat tukevat usein myös JPA: ta. Apache JDO -projektista saat lisätietoja JDO: sta suhteessa muihin pysyvyysstandardeihin, kuten JPA ja JDBC.
Datan pysyvyys Java-sovelluksessa
Ohjelmoinnin näkökulmasta ORM-kerros on adapterikerros: se mukauttaa objektikaavioiden kielen SQL- ja relaatiotaulukoiden kieleen. ORM-kerros antaa olio-kehittäjille mahdollisuuden rakentaa ohjelmistoja, jotka säilyttävät tietoja poistumatta olio-paradigmasta.
Kun käytät JPA: ta, luot kartta datakaupasta sovelluksesi tietomallikohteisiin. Sen sijaan, että määrittäisit, kuinka objektit tallennetaan ja noudetaan, määrität kohteiden ja tietokannan välisen kartoituksen ja vedät sitten JPA: n säilyttämään ne. Jos käytät relaatiotietokantaa, JDBC, Java Database Connectivity API, hoitaa suurimman osan sovelluskoodisi ja tietokannan välisestä todellisesta yhteydestä.
Specific, JPA tarjoaa metatietojen merkinnät, jonka avulla määrität objektien ja tietokannan välisen kartoituksen. Jokainen JPA-toteutus tarjoaa oman moottorin JPA-merkinnöille. JPA-spesifikaatio tarjoaa myös PersistanceManager
tai EntityManager
, jotka ovat keskeisiä yhteyspisteitä JPA-järjestelmään (jolloin yrityksesi logiikkakoodi kertoo järjestelmälle, mitä tehdä kartoitettujen objektien kanssa).
Voit tehdä kaiken tämän konkreettisemmaksi harkitsemalla Listing 1: tä, joka on yksinkertainen tietoluokka muusikon mallintamiseen.
Listaus 1. Yksinkertainen tietoluokka Java-muodossa
julkisen luokan muusikko {yksityinen pitkä id; yksityinen merkkijono nimi; yksityinen Instrumentin pääinstrumentti; yksityiset ArrayList-esitykset = uusi ArrayList (); julkinen muusikko (pitkä tunnus, merkkijonon nimi) {/ * rakentajan asettajat ... * /} public void setName (merkkijonon nimi) {this.name = nimi; } public String getName () {palauta tämä.nimi; } public void setMainInstrument (Instrument instr) {this.instrument = instr; } public Instrument getMainInstrument () {palauta tämä.instrumentti; } // ... muut ketjut ja asettimet ...}
Muusikko
Luettelon 1 luokkaa käytetään tietojen säilyttämiseen. Se voi sisältää primitiivisiä tietoja, kuten nimi ala. Se voi myös olla yhteydessä muihin luokkiin, kuten pääinstrumentti
ja esityksiä
.
Muusikko
on syy olla on sisältää tietoja. Tämän tyyppinen luokka tunnetaan joskus nimellä DTO tai tiedonsiirtoobjekti. DTO: t ovat yleinen piirre ohjelmistokehityksessä. Vaikka heillä on monenlaisia tietoja, ne eivät sisällä liiketoimintalogiikkaa. Pysyvät dataobjektit ovat yleinen haaste ohjelmistokehityksessä.
Tietojen pysyvyys JDBC: n kanssa
Yksi tapa tallentaa Muusikko
luokka relaatiotietokantaan olisi käyttää JDBC-kirjastoa. JDBC on abstraktiokerros, joka antaa sovelluksen antaa SQL-komentoja ajattelematta taustalla olevaa tietokannan toteutusta.
Listaus 2 näyttää, kuinka voit jatkaa Muusikko
luokka käyttäen JDBC: tä.
Listaus 2. JDBC lisää tietueen
Muusikko georgeHarrison = uusi muusikko (0, "George Harrison"); Merkkijono myDriver = "org.gjt.mm.mysql.Driver"; Merkkijono myUrl = "jdbc: mysql: // localhost / test"; Class.forName (myDriver); Yhteyden yhteys = DriverManager.getConnection (myUrl, "root", ""); Merkkijono kysely = "lisää käyttäjiin (tunnus, nimi) arvot (?,?)"; PreparedStatement parenguStmt = conn.prepareStatement (kysely); readyStmt.setInt (1, 0); ettevalmistettuStmt.setString (2, "George Harrison"); readyStmt.setString (2, "raunio"); readyStmt.execute (); yhteys. sulje (); // Virheenkäsittely poistettu lyhyyden vuoksi
Listing 2: n koodi on melko itse dokumentoituva. georgeHarrison
objekti voi tulla mistä tahansa (käyttöliittymän lähetys, ulkoinen palvelu jne.), ja sen ID- ja nimikentät on asetettu. Objektin kenttiä käytetään sitten SQL: n arvojen toimittamiseen lisää
lausunto. ( Valmisteltu lausunto
luokka on osa JDBC: tä ja tarjoaa tavan käyttää arvoja turvallisesti SQL-kyselyyn.)
Vaikka JDBC sallii manuaalisen määrityksen mukaisen ohjauksen, se on hankala verrattuna JPA: han. Tietokannan muokkaamiseksi sinun on ensin luotava SQL-kysely, joka yhdistää Java-objektisi relaatiotietokannan taulukoihin. Sitten sinun on muokattava SQL: ää aina, kun objektin allekirjoitus muuttuu. JDBC: n avulla SQL: n ylläpidosta tulee itsessään tehtävä.
Tietojen pysyvyys JPA: n kanssa
Harkitse nyt listaa 3, jossa jatkamme Muusikko
luokassa käyttämällä JPA: ta.
Listaus 3. George Harrisonin jatkaminen JPA: n kanssa
Muusikko georgeHarrison = uusi muusikko (0, "George Harrison"); muusikkoManager.save (georgeHarrison);
Listaus 3 korvaa manuaalisen listan 2 SQL: n yhdellä rivillä, session.save ()
, joka kehottaa JPA: ta säilyttämään objektin. Siitä lähtien SQL-muunnos hoidetaan kehyksessä, joten sinun ei tarvitse koskaan poistua olio-paradigmasta.
Sisällönkuvaustietojen merkinnät JPA: ssa
Listauksen 3 taika on seurausta a kokoonpano, joka on luotu JPA: n merkintöjen avulla. Kehittäjät käyttävät merkintöjä ilmoittamaan JPA: lle, mitkä objektit tulisi säilyttää ja miten niitä tulisi jatkaa.
Luettelossa 4 näkyy Muusikko
luokka yhdellä JPA-merkinnällä.
Luettelo 4. JPA: n @Entity-merkintä
@Entity julkisen luokan muusikko {// ..luokan runko}
Joskus kutsutaan pysyviä esineitä yhteisöt. Kiinnitys @Entity
luokalle, kuten Muusikko
ilmoittaa JPA: lle, että tämä luokka ja sen objektit tulisi säilyttää.
XML vs. merkintöihin perustuva kokoonpano
JPA tukee myös ulkoisten XML-tiedostojen käyttöä merkintöjen sijaan luokan metatietojen määrittelemiseksi. Mutta miksi tekisit sen itsellesi?
JPA: n määritys
Kuten useimmat modernit kehykset, JPA omaksuu koodaus sopimuksen mukaan (tunnetaan myös nimellä yleissopimus kokoonpanosta), jossa kehys tarjoaa oletusasetukset, jotka perustuvat alan parhaisiin käytäntöihin. Yhtenä esimerkkinä nimetty luokka Muusikko
kartoitetaan oletuksena tietokantataulukkoon nimeltä Muusikko.
Tavanomainen kokoonpano on aikaa säästävä, ja monissa tapauksissa se toimii riittävän hyvin. Voit myös mukauttaa JPA-kokoonpanoa. Voit käyttää esimerkiksi JPA: ta @Pöytä
merkintä taulukon määrittämiseksi, jossa Muusikko
luokka tulisi tallentaa.
Luettelo 5. JPA: n @Table-merkintä
@Entity @Table (name = "muusikko") julkisen luokan muusikko {// ..luokan runko}
Listaus 5 kehottaa JPA: ta jatkamaan entiteettiä (Muusikko
luokka) muusikko
pöytä.
Pääavain
JPA: ssa pääavain on kenttä, jota käytetään yksilöimään kukin objekti tietokannassa. Ensisijainen avain on hyödyllinen viitattaessa objekteja muihin objekteihin. Aina kun tallennat objektin taulukkoon, määrität myös kentän, jota käytetään sen ensisijaisena avaimena.
Luettelossa 6 kerromme JPA: lle, minkä kentän nimeä käytetään Muusikko
ensisijainen avain.
Luettelo 6. Ensisijaisen avaimen määrittäminen
@Entity julkisen luokan muusikko {@Id private Long id;
Tässä tapauksessa olemme käyttäneet yhteisiä edustajakokouksia @Id
merkintä id
kenttä Muusikko
ensisijainen avain. Oletusarvoisesti tämä kokoonpano olettaa, että ensisijainen avain asetetaan tietokannassa - esimerkiksi kun kentän asetus on automaattinen lisäys taulukossa.
JPA tukee muita strategioita objektin ensisijaisen avaimen luomiseksi. Siinä on myös merkintöjä yksittäisten kenttien nimien muuttamiseksi. Yleisesti ottaen JPA on riittävän joustava sopeutumaan mahdollisesti tarvitsemasi pysyvyyskartoitukseen.
CRUD-operaatiot
Kun olet kartoittanut luokan tietokantataulukkoon ja luonut sen ensisijaisen avaimen, sinulla on kaikki mitä tarvitset kyseisen luokan luomiseen, hakemiseen, poistamiseen ja päivittämiseen tietokannassa. Kutsumus session.save ()
luo tai päivittää määritetyn luokan riippuen siitä, onko ensisijaisen avaimen kenttä tyhjä vai koskeeko se olemassa olevaa entiteettiä. Kutsumus entityManager.remove ()
poistaa määritetyn luokan.
Entiteettisuhteet JPA: ssa
Yksinkertainen kohteen säilyttäminen primitiivisellä kentällä on vain puolet yhtälöstä. Yhteinen edustajakokous pystyy myös hallitsemaan yksiköitä suhteessa toisiinsa. Neljä erilaista kokonaisuussuhdetta on mahdollista sekä taulukoissa että objekteissa:
- Yksi moniin
- Monta-yhteen
- Monista moniin
- Yksi yhteen
Kukin suhdetyyppi kuvaa, kuinka entiteetti liittyy muihin entiteetteihin. Esimerkiksi Muusikko
yhteisöllä voisi olla yksi moniin -suhde kanssa Esitys
, yhteisö, jota edustaa kokoelma, kuten Lista
tai Aseta
.
Jos Muusikko
mukana Bändi
kentässä näiden yksiköiden välinen suhde voisi olla monta yhteen, mikä tarkoittaa Muusikko
s singlellä Bändi
luokassa. (Olettaen, että jokainen muusikko esiintyy vain yhdessä bändissä.)
Jos Muusikko
mukana Bandmates
kenttä, joka voisi edustaa a moni-moni-suhde toisen kanssa Muusikko
yhteisöt.
Lopuksi, Muusikko
voi olla henkilökohtainen suhde kanssa Lainata
entiteetti, jota käytetään edustamaan kuuluisaa lainausta: Quote kuuluisa Quote = uusi lainaus ()
.
Suhdetyyppien määrittely
JPA: lla on merkinnät jokaiselle suhteiden kartoitustyypilleen. Listaus 7 näyttää, kuinka voit merkitä yhden ja monen välisen suhteen Muusikko
ja Esitys
s.