Programmering

Hvad er JPA? Introduktion til Java Persistence API

Som en specifikation er Java Persistence API beskæftiget med udholdenhed, som løst betyder enhver mekanisme, hvormed Java-objekter overlever den applikationsproces, der oprettede dem. Ikke alle Java-objekter skal være vedvarende, men de fleste applikationer har vigtige forretningsobjekter. JPA-specifikationen lader dig definere hvilken objekter skal vedholdes, og hvordan disse objekter skal være vedvarende i dine Java-applikationer.

I sig selv er JPA ikke et værktøj eller en ramme; snarere definerer det et sæt koncepter, der kan implementeres af ethvert værktøj eller ramme. Mens JPA's model-relationelle kortlægning (ORM) model oprindeligt var baseret på dvale, har den siden udviklet sig. Mens JPA oprindeligt var beregnet til brug med relationelle / SQL-databaser, er nogle JPA-implementeringer udvidet til brug med NoSQL-datalagre. En populær ramme, der understøtter JPA med NoSQL, er EclipseLink, referenceimplementeringen til JPA 2.2.

JPA 2.2 i Jakarta EE

Java Persistence API blev først frigivet som en delmængde af EJB 3.0-specifikationen (JSR 220) i Java EE 5. Den har siden udviklet sig som sin egen spec, startende med frigivelsen af ​​JPA 2.0 i Java EE 6 (JSR 317). I skrivende stund er JPA 2.2 blevet vedtaget til fortsættelse som en del af Jakarta EE.

JPA og dvale

På grund af deres sammenflettede historie samles dvale og JPA ofte. Ligesom Java Servlet-specifikationen har JPA imidlertid skabt mange kompatible værktøjer og rammer; Dvaletilstand er kun en af ​​dem.

Udviklet af Gavin King og udgivet i begyndelsen af ​​2002, er Hibernate et ORM-bibliotek til Java. King udviklede dvale som et alternativ til enhedsbønner for persistens. Rammen var så populær og så nødvendig på det tidspunkt, at mange af dens ideer blev vedtaget og kodificeret i den første JPA-specifikation.

I dag er Hibernate ORM en af ​​de mest modne JPA-implementeringer og stadig en populær mulighed for ORM i Java. Dvaletilstand ORM 5.3.8 (den nuværende version i skrivende stund) implementerer JPA 2.2. Derudover er Hibernates familie af værktøjer udvidet til at omfatte populære værktøjer som Hibernate Search, Hibernate Validator og Hibernate OGM, som understøtter domæne-model vedholdenhed for NoSQL.

JPA og EJB

Som tidligere nævnt blev JPA introduceret som en delmængde af EJB 3.0, men har siden udviklet sig som sin egen specifikation. EJB er en specifikation med et andet fokus end JPA og implementeres i en EJB-container. Hver EJB-container indeholder et persistenslag, der er defineret af JPA-specifikationen.

Hvad er Java ORM?

Mens de adskiller sig i udførelse, giver hver JPA-implementering en slags ORM-lag. For at forstå JPA og JPA-kompatible værktøjer skal du have en god forståelse af ORM.

Objektrelationel kortlægning er en opgave–En som udviklere har god grund til at undgå at gøre manuelt. En ramme som Hibernate ORM eller EclipseLink kodificerer den opgave i et bibliotek eller en ramme, en ORM-lag. Som en del af applikationsarkitekturen er ORM-laget ansvarlig for at styre konverteringen af ​​softwareobjekter til at interagere med tabellerne og kolonnerne i en relationsdatabase. I Java konverterer ORM-laget Java-klasser og objekter, så de kan gemmes og administreres i en relationsdatabase.

Som standard bliver navnet på det objekt, der vedholdes, navnet på tabellen, og felter bliver kolonner. Når tabellen er sat op, svarer hver tabelrækker til et objekt i applikationen. Objektkortlægning kan konfigureres, men standarder har tendens til at fungere godt.

JPA med NoSQL

Indtil for nylig var ikke-relationelle databaser usædvanlige kuriositeter. NoSQL-bevægelsen ændrede alt dette, og nu er en række NoSQL-databaser tilgængelige for Java-udviklere. Nogle JPA-implementeringer har udviklet sig til at omfavne NoSQL, herunder Hibernate OGM og EclipseLink.

Figur 1 illustrerer rollen som JPA og ORM-laget i applikationsudvikling.

JavaWorld /

Konfiguration af Java ORM-laget

Når du opretter et nyt projekt til brug af JPA, skal du konfigurere datalageret og JPA-udbyderen. Du konfigurerer en datalagerstik for at oprette forbindelse til din valgte database (SQL eller NoSQL). Du inkluderer også og konfigurerer JPA-udbyder, som er en ramme såsom Hibernate eller EclipseLink. Mens du kan konfigurere JPA manuelt, vælger mange udviklere at bruge Spring's out-of-the-box support. Se "JPA installation og opsætning"nedenfor for en demonstration af både manuel og fjederbaseret JPA installation og opsætning.

Java-dataobjekter

Java Data Objects er en standardiseret persistensramme, der adskiller sig fra JPA primært ved at understøtte persistenslogik i objektet og ved dets mangeårige support til at arbejde med ikke-relationelle datalagre. JPA og JDO er ens nok til, at JDO-udbydere ofte også understøtter JPA. Se Apache JDO-projektet for at lære mere om JDO i forhold til andre persistensstandarder som JPA og JDBC.

Data persistens i Java

Fra et programmeringsperspektiv er ORM-laget et adapterlag: det tilpasser sproget for objektgrafer til sproget i SQL og relationstabeller. ORM-laget giver objektorienterede udviklere mulighed for at opbygge software, der vedvarer data uden nogensinde at forlade det objektorienterede paradigme.

Når du bruger JPA, opretter du en kort fra datalageret til din applikations datamodelobjekter. I stedet for at definere, hvordan objekter gemmes og hentes, definerer du kortlægningen mellem objekter og din database og påberåber derefter JPA for at fortsætte dem. Hvis du bruger en relationsdatabase, håndteres meget af den faktiske forbindelse mellem din applikationskode og databasen af ​​JDBC, Java Database Connectivity API.

Som en specifikation giver JPA annoncer om metadata, som du bruger til at definere kortlægningen mellem objekter og databasen. Hver JPA-implementering giver sin egen motor til JPA-kommentarer. JPA-specifikationen giver også PersistanceManager eller EntityManager, som er de vigtigste kontaktpunkter med JPA-systemet (hvor din forretningslogikode fortæller systemet, hvad de skal gøre med de kortlagte objekter).

For at gøre alt dette mere konkret, overvej Listing 1, som er en simpel dataklasse til modellering af en musiker.

Notering 1. En simpel dataklasse i Java

 offentlig klasse musiker {privat Lang id; privat strengnavn; private instrument MainInstrument; private ArrayList forestillinger = nye ArrayList (); offentlig musiker (langt id, strengnavn) {/ * konstruktorsættere ... * /} offentligt ugyldigt sætnavn (strengnavn) {dette.navn = navn; } offentlig String getName () {returner dette.navn; } public void setMainInstrument (Instrumentinstrument) {this.instrument = instr; } offentligt instrument getMainInstrument () {returner this.instrument; } // ... Andre getters og settere ...} 

Det Musiker klasse i liste 1 bruges til at opbevare data. Det kan indeholde primitive data som f.eks navn Mark. Det kan også holde relationer til andre klasser såsom mainInstrument og forestillinger.

Musiker's grund til at være skal indeholde data. Denne type klasse er undertiden kendt som en DTO, eller dataoverførselsobjekt. DTO'er er et fælles træk ved softwareudvikling. Mens de har mange slags data, indeholder de ingen forretningslogik. Vedvarende dataobjekter er en allestedsnærværende udfordring i softwareudvikling.

Data persistens med JDBC

En måde at gemme en forekomst af Musiker klasse til en relationsdatabase ville være at bruge JDBC-biblioteket. JDBC er et abstraktionslag, der lader et program udstede SQL-kommandoer uden at tænke på den underliggende databaseimplementering.

Liste 2 viser, hvordan du kan vedvare Musiker klasse ved hjælp af JDBC.

Notering 2. JDBC indsætter en post

 Musiker georgeHarrison = ny musiker (0, "George Harrison"); Streng myDriver = "org.gjt.mm.mysql.Driver"; String myUrl = "jdbc: mysql: // localhost / test"; Class.forName (myDriver); Forbindelse conn = DriverManager.getConnection (myUrl, "root", ""); Strengeforespørgsel = "indsæt i brugere (id, navn) værdier (?,?)"; PreparedStatement preparedStmt = conn.prepareStatement (forespørgsel); preparedStmt.setInt (1, 0); preparedStmt.setString (2, "George Harrison"); preparedStmt.setString (2, "Rubble"); preparedStmt.execute (); forbind. luk (); // Fejlhåndtering fjernet for kortfattethed 

Koden i Listing 2 er ret selvdokumenterende. Det georgeHarrison objekt kan komme fra hvor som helst (frontend-send, ekstern service osv.) og har sit ID og navnefelter indstillet. Felterne på objektet bruges derefter til at levere værdierne for en SQL indsæt udmelding. (Det PreparedStatement klasse er en del af JDBC og tilbyder en måde til sikkert at anvende værdier på en SQL-forespørgsel.)

Mens JDBC tillader kontrol, der kommer med manuel konfiguration, er det besværligt sammenlignet med JPA. For at ændre databasen skal du først oprette en SQL-forespørgsel, der kortlægger fra dit Java-objekt til tabellerne i en relationsdatabase. Du skal derefter ændre SQL, når en objektsignatur ændres. Med JDBC bliver vedligeholdelse af SQL en opgave i sig selv.

Data persistens med JPA

Overvej nu Listing 3, hvor vi vedvarer Musiker klasse ved hjælp af JPA.

Liste 3. Vedholdende George Harrison med JPA

 Musiker georgeHarrison = ny musiker (0, "George Harrison"); musicianManager.save (georgeHarrison); 

Listing 3 erstatter den manuelle SQL fra Listing 2 med en enkelt linje, session.save (), som beder JPA om at fastholde objektet. Fra da af håndteres SQL-konverteringen af ​​rammen, så du behøver aldrig at forlade det objektorienterede paradigme.

Annoncer om metadata i JPA

Magien i Listing 3 er resultatet af en konfiguration, som er oprettet ved hjælp af JPA's kommentarer. Udviklere bruger annoteringer til at informere JPA om, hvilke objekter der skal vedholdes, og hvordan de skal vedholdes.

Fortegnelse 4 viser Musiker klasse med en enkelt JPA-kommentar.

Notering 4. JPA's @Entity-kommentar

 @Entity offentlig klasse musiker {// ..klasse krop} 

Vedvarende genstande kaldes undertiden enheder. Fastgørelse @Enhed til en klasse som Musiker informerer JPA om, at denne klasse og dens objekter skal bestå.

XML vs. annotationsbaseret konfiguration

JPA understøtter også anvendelse af eksterne XML-filer i stedet for annoteringer til at definere klassemetadata. Men hvorfor ville du gøre det mod dig selv?

Konfiguration af JPA

Som de fleste moderne rammer omfavner JPA kodning efter konvention (også kendt som konvention over konfiguration), hvor rammen giver en standardkonfiguration baseret på branchens bedste praksis. Som et eksempel kaldes en klasse Musiker ville blive kortlagt som standard til en databasetabel, der hedder Musiker.

Den konventionelle konfiguration er tidsbesparende, og i mange tilfælde fungerer den godt nok. Det er også muligt at tilpasse din JPA-konfiguration. Som et eksempel kan du bruge JPA'er @Bord kommentar for at specificere den tabel, hvor Musiker klasse skal opbevares.

Notering 5. JPA's @Table annotation

 @Entity @Table (name = "musician") offentlig klasse musiker {// ..class body} 

Fortegnelse 5 fortæller JPA at fastholde enheden (Musiker klasse) til musiker bord.

Primærnøgle

I JPA er primærnøgle er det felt, der bruges til entydigt at identificere hvert objekt i databasen. Den primære nøgle er nyttig til henvisning og tilknytning af objekter til andre enheder. Når du gemmer et objekt i en tabel, angiver du også det felt, der skal bruges som dets primære nøgle.

I liste 6 fortæller vi JPA, hvilket felt der skal bruges som Musiker's primære nøgle.

Fortegnelse 6. Angivelse af den primære nøgle

 @Entity offentlig klasse musiker {@Id privat Lang id; 

I dette tilfælde har vi brugt JPA'er @Id kommentar for at specificere id felt som Musiker's primære nøgle. Som standard antager denne konfiguration, at den primære nøgle indstilles af databasen - for eksempel når feltet er indstillet til automatisk stigning på bordet.

JPA understøtter andre strategier til generering af et objekts primære nøgle. Det har også kommentarer til ændring af individuelle feltnavne. Generelt er JPA fleksibel nok til at tilpasse sig enhver vedholdende kortlægning, du muligvis har brug for.

CRUD-operationer

Når du har kortlagt en klasse til en databasetabel og etableret dens primære nøgle, har du alt hvad du behøver for at oprette, hente, slette og opdatere den klasse i databasen. Ringer session.save () opretter eller opdaterer den angivne klasse, afhængigt af om det primære nøglefelt er nul eller gælder for en eksisterende enhed. Ringer entityManager.remove () sletter den angivne klasse.

Enhedsrelationer i JPA

Simpelthen vedholdende et objekt med et primitivt felt er kun halvdelen af ​​ligningen. JPA har også evnen til at styre enheder i forhold til hinanden. Fire slags enhedsforhold er mulige i både tabeller og objekter:

    1. En-til-mange
    2. Mange-til-en
    3. Mange-til-mange
    4. En til en

Hver type forhold beskriver, hvordan en enhed forholder sig til andre enheder. F.eks Musiker enhed kunne have en et-til-mange forhold med Ydeevne, en enhed repræsenteret af en samling som f.eks Liste eller Sæt.

Hvis den Musiker inkluderet a Band felt, kunne forholdet mellem disse enheder være mange-til-en, antyder samling af Musikers på singlen Band klasse. (Forudsat at hver musiker kun optræder i et enkelt band.)

Hvis Musiker inkluderet a BandMates felt, der kunne repræsentere et mange-til-mange forhold med andre Musiker enheder.

Langt om længe, Musiker kan have en et-til-et forhold med en Citere enhed, der bruges til at repræsentere et berømt citat: Citat famousQuote = nyt citat ().

Definition af forholdstyper

JPA har annoteringer for hver af sine tilknytningskorttyper. Fortegnelse 7 viser, hvordan du kan kommentere en-til-mange forholdet mellem Musiker og Ydeevnes.

Notering 7. Annotering af et en-til-mange forhold

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