Ohjelmointi

Mikä on JPA? Johdanto Java Persistence -sovellusliittymään

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ä.

Muusikkoon 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 Muusikkoensisijainen 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ä Muusikkoensisijainen 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:

    1. Yksi moniin
    2. Monta-yhteen
    3. Monista moniin
    4. 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 Muusikkos 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 Esityss.

Listaus 7. Yhden moniin -suhteen merkitseminen