Programavimas

Kas yra JPA? Įvadas į „Java Persistence“ API

Kaip specifikacija yra susijusi „Java Persistence“ API atkaklumas, kuris laisvai reiškia bet kokį mechanizmą, kuriuo „Java“ objektai pralenkia juos sukūrusį taikymo procesą. Ne visus „Java“ objektus reikia išlaikyti, tačiau dauguma programų išlaiko pagrindinius verslo objektus. JPA specifikacija leidžia apibrėžti kuri objektai turėtų būti išlaikomi ir kaip šie objektai turėtų išlikti jūsų „Java“ programose.

JPA savaime nėra priemonė ar pagrindas; greičiau apibrėžiamas sąvokų rinkinys, kurį galima įgyvendinti naudojant bet kurį įrankį ar sistemą. Nors JPA objektų ir reliacijų žemėlapių (ORM) modelis iš pradžių buvo pagrįstas hibernate, nuo to laiko jis vystėsi. Panašiai, nors JPA iš pradžių buvo skirta naudoti su reliacinėmis / SQL duomenų bazėmis, kai kurie JPA diegimai buvo išplėsti naudoti su „NoSQL“ duomenų saugyklomis. Populiari sistema, palaikanti JPA su NoSQL, yra „EclipseLink“, JPA 2.2 nuoroda.

JPA 2.2 Džakartoje, EE

„Java Persistence“ API pirmą kartą buvo išleista kaip „EJB 3.0“ specifikacijos (JSR 220) pogrupis „Java EE 5.“. Nuo to laiko ji buvo plėtojama kaip savo specifikacija, pradedant „JPA 2.0“ išleidimu „Java EE 6“ (JSR 317). Nuo šio rašto JPA 2.2 buvo patvirtinta tęsti kaip „Jakarta EE“ dalis.

JPA ir žiemos miegas

Dėl persipynusios istorijos „Hibernate“ ir JPA dažnai maišomi. Tačiau, kaip ir „Java Servlet“ specifikacija, JPA sukūrė daug suderinamų įrankių ir sistemų; Hibernate yra tik vienas iš jų.

Gibino Kingo sukurtas ir 2002 m. Pradžioje išleistas „Hibernate“ yra „Java“ ORM biblioteka. Kingas sukūrė „Hibernate“ kaip alternatyvą pupinėms pupelėms. Ši sistema buvo tokia populiari ir tuo metu taip reikalinga, kad daugelis jos idėjų buvo priimtos ir kodifikuotos pirmojoje JPA specifikacijoje.

Šiandien „Hibernate ORM“ yra vienas iš brandžiausių JPA įgyvendinimų ir vis dar populiarus „ORM“ variantas „Java“. Hibernate ORM 5.3.8 (dabartinė šio rašymo versija) įgyvendina JPA 2.2. Be to, „Hibernate“ įrankių šeima išsiplėtė įtraukdama populiarius įrankius, tokius kaip „Hibernate Search“, „Hibernate Validator“ ir „Hibernate OGM“, palaikanti „NoSQL“ domeno modelio patvarumą.

JPA ir EJB

Kaip pažymėta anksčiau, JPA buvo pristatyta kaip EJB 3.0 pogrupis, tačiau nuo to laiko ji buvo plėtojama kaip savo specifikacija. EJB yra specifikacija, kurios dėmesys skiriasi nuo JPA, ir yra įgyvendinama EJB talpykloje. Kiekviename EJB konteineryje yra patvarumo sluoksnis, kurį apibrėžia JPA specifikacija.

Kas yra „Java“ ORM?

Nors jie skiriasi vykdymu, kiekvienas JPA įgyvendinimas suteikia tam tikrą ORM sluoksnį. Norėdami suprasti JPA ir JPA suderinamus įrankius, turite gerai suprasti ORM.

Objektų-santykių atvaizdavimas yra a užduotisKūrėjai turi rimtų priežasčių vengti daryti rankiniu būdu. Tokia sistema kaip „Hibernate ORM“ arba „EclipseLink“ koduoja tą užduotį į biblioteką ar sistemą ORM sluoksnis. Kaip programos architektūros dalis, ORM sluoksnis yra atsakingas už programinės įrangos objektų konversijos valdymą, kad sąveikautų su reliacinės duomenų bazės lentelėmis ir stulpeliais. „Java“ sistemoje ORM sluoksnis konvertuoja „Java“ klases ir objektus taip, kad juos būtų galima saugoti ir valdyti reliacinėje duomenų bazėje.

Pagal numatytuosius nustatymus išlaikomo objekto pavadinimas tampa lentelės pavadinimu, o laukai - stulpeliais. Sukūrus lentelę, kiekviena lentelės eilutė atitinka programos objektą. Objektų atvaizdavimą galima konfigūruoti, tačiau numatytieji nustatymai paprastai veikia gerai.

JPA su „NoSQL“

Dar gana neseniai nereliacinės duomenų bazės buvo neįprasti kuriozai. „NoSQL“ judėjimas visa tai pakeitė, o dabar „Java“ kūrėjams yra prieinamos įvairios NoSQL duomenų bazės. Kai kurie JPA įgyvendinimai buvo išplėsti, kad apimtų „NoSQL“, įskaitant „Hibernate OGM“ ir „EclipseLink“.

1 paveiksle pavaizduotas JPA ir ORM sluoksnio vaidmuo kuriant programą.

„JavaWorld“ /

„Java ORM“ sluoksnio konfigūravimas

Kai sukursite naują projektą, naudodamiesi JPA, turėsite sukonfigūruoti duomenų saugyklą ir JPA teikėją. Konfigūruosite a duomenų saugyklos jungtis prisijungti prie pasirinktos duomenų bazės (SQL arba NoSQL). Taip pat įtrauksite ir sukonfigūruosite JPA teikėjas, kuri yra tokia sistema kaip „Hibernate“ arba „EclipseLink“. Nors JPA galite konfigūruoti rankiniu būdu, daugelis kūrėjų pasirenka naudoti „Spring“ palaikymą. Matyti "JPA diegimas ir nustatymas"žemiau, jei norite parodyti JPA diegimą ir nustatymą rankiniu būdu ir pavasarį.

„Java“ duomenų objektai

„Java Data Objects“ yra standartizuota patvarumo sistema, kuri skiriasi nuo JPA pirmiausia palaikydama objekto atkaklumo logiką ir ilgą laiką palaikydama darbą su nesusijusių duomenų saugyklomis. JPA ir JDO yra pakankamai panašūs, kad JDO teikėjai taip pat palaiko JPA. Žr. „Apache JDO“ projektą, kad sužinotumėte daugiau apie JDO, palyginti su kitais patvarumo standartais, tokiais kaip JPA ir JDBC.

Duomenų išlikimas „Java“

Žiūrint iš programavimo perspektyvos, ORM sluoksnis yra adapterio sluoksnis: ji pritaiko objektų grafikų kalbą prie SQL ir reliacinių lentelių kalbos. ORM sluoksnis leidžia į objektą orientuotiems kūrėjams kurti programinę įrangą, kuri išlaiko duomenis, niekada nepaliekant objektyvios paradigmos.

Kai naudojate JPA, sukuriate žemėlapis nuo duomenų saugyklos iki jūsų programos duomenų modelio objektų. Užuot apibrėžę, kaip objektai saugomi ir gaunami, apibrėžiate objektų ir duomenų bazės susiejimą, tada kreipkitės į JPA, kad jie išliktų. Jei naudojate reliacinę duomenų bazę, didžiąją dalį faktinio jūsų programos kodo ir duomenų bazės ryšio tada tvarkys JDBC, „Java Database Connectivity API“.

Kaip spec., JPA numato metaduomenų anotacijos, kurį naudojate apibrėždami objektų ir duomenų bazės susiejimą. Kiekvienas JPA įgyvendinimas suteikia savo variklį JPA anotacijoms. JPA specifikacijoje taip pat pateikiama PersistanceManager arba „EntityManager“, kurie yra pagrindiniai sąlyčio su JPA sistema taškai (kur jūsų verslo logikos kodas sistemai nurodo, ką daryti su susietais objektais).

Kad visa tai būtų konkretiau, apsvarstykite 1 sąrašą, kuris yra paprasta duomenų klasė, skirta muzikantui modeliuoti.

Sąrašai 1. Paprasta „Java“ duomenų klasė

 viešoji klasė Muzikantas {private Long id; asmeninės eilutės pavadinimas; privatus instrumento pagrindinis instrumentas; privatūs „ArrayList“ pasirodymai = naujas „ArrayList“ (); public Musician (Long id, String name) {/ * konstruktoriaus nustatytojai ... * /} public void setName (String name) {this.name = name; } public String getName () {grąžinti šį.pavadinimą; } public void setMainInstrument (Instrument instr) {this.instrument = instr; } public Instrument getMainInstrument () {grąžinti šį.instrumentą; } // ... Kiti getters ir seteriai ...} 

Muzikantas 1 sąrašo klasė naudojama duomenims laikyti. Jame gali būti primityvių duomenų, tokių kaip vardas srityje. Jis taip pat gali palaikyti ryšius su kitomis klasėmis, tokiomis kaip pagrindinisInstrumentas ir pasirodymai.

Muzikantas's buvimo priežastis turi būti duomenys. Šio tipo klasės kartais vadinamos DTO arba duomenų perdavimo objektas. DTO yra bendras programinės įrangos kūrimo bruožas. Nors jie turi daugybę duomenų, juose nėra jokios verslo logikos. Nuolatiniai duomenų objektai yra visuotinis iššūkis kuriant programinę įrangą.

Duomenų patvarumas naudojant JDBC

Vienas iš būdų išsaugoti Muzikantas klasės į reliacinę duomenų bazę būtų naudoti JDBC biblioteką. JDBC yra abstrakcijos sluoksnis, leidžiantis programai išleisti SQL komandas, negalvojant apie pagrindinį duomenų bazės įgyvendinimą.

2 sąrašas rodo, kaip galėtumėte išlikti Muzikantas klasė naudojant JDBC.

Sąrašas 2. JDBC įterpti įrašą

 Muzikantas georgeHarrison = naujas muzikantas (0, "George Harrison"); Eilutė myDriver = "org.gjt.mm.mysql.Driver"; Eilutė myUrl = "jdbc: mysql: // localhost / test"; „Class.forName“ („myDriver“); Ryšio jungtis = DriverManager.getConnection (myUrl, "root", ""); String query = "įterpti į vartotojus (id, name) reikšmes (?,?)"; PreparedStatement parengtasStmt = conn.prepareStatement (užklausa); parengtasStmt.setInt (1, 0); parengtasStmt.setString (2, "George Harrison"); parengtasStmt.setString (2, "Skalda"); parengtasStmt.execute (); prisijungti.uždaryti (); // Klaidos tvarkymas pašalintas dėl trumpumo 

2 sąrašo kodas yra gana savarankiškas. George'as Harisonas objektas gali būti iš bet kurios vietos (pateikimas iš išorės, išorinė tarnyba ir kt.), o jo ID ir vardo laukai nustatyti. Tada objekto laukai naudojami SQL reikšmėms pateikti Įdėti pareiškimas. ( Parengta pareiškimas klasė yra JDBC dalis, siūlanti būdą, kaip saugiai pritaikyti reikšmes SQL užklausai.)

Nors JDBC leidžia valdyti rankiniu būdu, tai yra sudėtinga, palyginti su JPA. Norėdami modifikuoti duomenų bazę, pirmiausia turite sukurti SQL užklausą, kuri susieja iš jūsų „Java“ objekto į reliacinės duomenų bazės lenteles. Tada keisdami objekto parašą, turėsite modifikuoti SQL. Su JDBC SQL palaikymas tampa savaime.

Duomenų atkaklumas naudojant JPA

Dabar apsvarstykite 3 sąrašą, kuriame mes išlikome Muzikantas klasė naudojant JPA.

3 sąrašas. Išliekantis George Harrison JPA

 Muzikantas georgeHarrison = naujas muzikantas (0, "George Harrison"); muzikantasManager.save (GeorgeHarrison); 

3 sąrašas pakeičia rankinį SQL iš 2 sąrašo viena eilute, session.save (), kuris nurodo JPA išlaikyti objektą. Nuo tada SQL konversiją tvarko sistema, todėl niekada nereikia palikti objektyvios paradigmos.

JPA metaduomenų anotacijos

3 sąrašo magija yra a rezultatas konfigūracija, kuris sukurtas naudojant JPA anotacijas. Kūrėjai naudoja anotacijas informuodami JPA, kurie objektai turėtų būti išlaikomi ir kaip jie turėtų būti išlaikomi.

4 sąrašas rodo Muzikantas klasė su viena JPA anotacija.

4 sąrašas. JPA @Entity anotacija

 „@Entity“ viešosios klasės muzikantas {// ..class body} 

Kartais vadinami nuolatiniai daiktai subjektai. Tvirtinimas @Entity į tokią klasę Muzikantas informuoja JPA, kad ši klasė ir jos objektai turėtų išlikti.

XML ir anotacijomis pagrįsta konfigūracija

JPA taip pat palaiko išorinių XML failų naudojimą vietoj anotacijų klasės metaduomenims apibrėžti. Bet kodėl jūs taip darytumėte sau?

JPA konfigūravimas

Kaip ir dauguma šiuolaikinių sistemų, JPA apima kodavimas pagal sutartis (taip pat žinomas kaip susitarimas dėl konfigūracijos), kuriame sistema pateikia numatytąją konfigūraciją, pagrįstą geriausia pramonės praktika. Kaip vieną pavyzdį klasė pavadinta Muzikantas pagal numatytuosius nustatymus būtų susieta su duomenų bazės lentele, vadinama Muzikantas.

Įprasta konfigūracija yra laiko taupymo priemonė, ir daugeliu atvejų ji veikia pakankamai gerai. Taip pat galima pritaikyti savo JPA konfigūraciją. Kaip pavyzdį galite naudoti JPA @ Lentelė anotacija nurodyti lentelę, kurioje Muzikantas klasė turėtų būti saugoma.

5 sąrašas. JPA @Table anotacija

 @Entity @Table (name = "musician") public class Musician {// ..class body} 

5 sąraše JPA nurodoma išlaikyti subjektą (Muzikantas klasė) į muzikantas stalo.

Pagrindinis raktas

JPA metu pagrindinis raktas yra laukas, naudojamas unikaliai identifikuoti kiekvieną objektą duomenų bazėje. Pagrindinis raktas yra naudingas objektams susieti ir susieti su kitais objektais. Kai saugote objektą lentelėje, taip pat nurodysite lauką, kurį norite naudoti kaip pagrindinį raktą.

6 sąraše JPA nurodome, kokį lauką naudoti Muzikantaspagrindinis raktas.

Sąrašas 6. Nurodomas pagrindinis raktas

 @Entity viešosios klasės muzikantas {@Id private Long id; 

Šiuo atveju mes naudojome JPA @Id anotacija nurodyti id srityje kaip Muzikantaspagrindinis raktas. Pagal numatytuosius nustatymus ši konfigūracija daro prielaidą, kad pagrindinį raktą nustatys duomenų bazė, pavyzdžiui, kai lauke lentelėje nustatytas automatinis prieaugis.

JPA palaiko kitas pirminio objekto rakto generavimo strategijas. Jame taip pat yra atskirų laukų pavadinimų keitimo anotacijos. Apskritai JPA yra pakankamai lanksti, kad prisitaikytų prie bet kokių jums reikalingų atkaklumo žemėlapių.

CRUD operacijos

Susieję klasę su duomenų bazės lentele ir sukūrę jos pagrindinį raktą, turite viską, ko reikia norint sukurti, gauti, ištrinti ir atnaujinti tą klasę duomenų bazėje. Skambinama session.save () sukurs arba atnaujins nurodytą klasę, priklausomai nuo to, ar pirminio rakto laukas yra nulis, ar jis taikomas esamam subjektui. Skambinama entityManager.remove () ištrins nurodytą klasę.

Subjektų santykiai JPA

Paprasčiausias objekto išlaikymas su primityviu lauku yra tik pusė lygties. JPA taip pat turi galimybę valdyti subjektus vienas kito atžvilgiu. Tiek lentelėse, tiek objektuose galimi keturių rūšių subjektų santykiai:

    1. Vienas prie daugelio
    2. Daugelis į vieną
    3. Daug daug
    4. Vienas prie vieno

Kiekvienas santykių tipas apibūdina, kaip subjektas yra susijęs su kitais subjektais. Pavyzdžiui, Muzikantas subjektas galėtų turėti santykis „vienas su daugeliu“ su Spektaklis, subjektas, atstovaujamas tokios kolekcijos kaip Sąrašas arba Nustatyti.

Jei Muzikantas įtraukta a Juosta santykis tarp šių subjektų galėtų būti daug prie vieno, o tai reiškia, kad Muzikantass viename Juosta klasė. (Darant prielaidą, kad kiekvienas muzikantas koncertuoja tik vienoje grupėje.)

Jei Muzikantas įtraukta a Grupės draugai srityje, tai galėtų reikšti santykiai nuo daugelio iki daugelio su kitu Muzikantas subjektai.

Pagaliau, Muzikantas gali turėti santykiai „vienas su vienu“ su Citata subjektas, naudojamas žymėti citatą: Citata garsi Quote = nauja citata ().

Santykių tipų apibrėžimas

JPA turi anotacijas kiekvienam savo santykių atvaizdavimo tipui. 7 sąrašas rodo, kaip galite komentuoti santykį „vienas su daugeliu“ Muzikantas ir Spektakliss.

7. sąrašas. Pažymėkite santykį „vienas su daugeliu“

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