Hvad er JPA? Introduktion til Java Persistence API

som en specifikation er Java Persistence API bekymret for persistens, hvilket løst betyder enhver mekanisme, hvormed Java-objekter overlever den applikationsproces, der oprettede dem. Ikke alle Java-objekter skal opretholdes, men de fleste applikationer vedvarer vigtige forretningsobjekter. JPA-specifikationen giver dig mulighed for at definere, hvilke objekter der skal vedvares, og hvordan disse objekter skal vedvares i dine Java-applikationer.

i sig selv er JPA ikke et værktøj eller en ramme; det definerer snarere et sæt koncepter, der kan implementeres af ethvert værktøj eller ramme. Mens JPA ‘ s objekt-relationelle kortlægning (ORM) model oprindeligt var baseret på Hibernate, har den siden udviklet sig. På samme måde, mens JPA oprindeligt var beregnet til brug med relationelle/KVL-databaser, er nogle JPA-implementeringer blevet udvidet til brug med Noskl-datalagre. En populær ramme, der understøtter JPA med Noskl, er EclipseLink, referenceimplementeringen for JPA 2.2.

JPA og Hibernate

på grund af deres sammenflettede historie er Hibernate og JPA ofte sammenflettet. Ligesom Java Servlet-specifikationen har JPA imidlertid skabt mange kompatible værktøjer og rammer; Hibernate er kun en af dem.udviklet af Gavin King og udgivet i begyndelsen af 2002, Hibernate er et ORM-bibliotek til Java. King udviklede Hibernate som et alternativ til entity beans for vedholdenhed. 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. Dvale ORM 5.3.8 (den nuværende version fra denne skrivning) implementerer JPA 2.2. Derudover har Hibernate ‘ s 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ænemodellens persistens.

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 et godt greb om ORM.

objekt-relationel 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 denne opgave i et bibliotek eller en ramme, et ORM-lag. Som en del af applikationsarkitekturen er ORM-laget ansvarligt for at styre konverteringen af programobjekter til at interagere med tabeller og kolonner 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 vedvarer, navnet på tabellen, og felter bliver kolonner. Når tabellen er konfigureret, svarer hver tabelrække til et objekt i applikationen. Objektkortlægning kan konfigureres, men standardindstillinger har tendens til at fungere godt.

Figur 1 illustrerer JPA ‘ s og ORM-lagets rolle i applikationsudviklingen.

Javaverden / IDG

Figur 1. JPA og ORM-laget

konfiguration af Java ORM-laget

når du opretter et nyt projekt til brug af JPA, skal du konfigurere datalager og JPA-udbyder. Du konfigurerer et datastore-stik til at oprette forbindelse til din valgte database. Du inkluderer og konfigurerer også JPA-udbyderen, som er en ramme som Hibernate eller EclipseLink. Mens du kan konfigurere JPA manuelt, vælger mange udviklere at bruge Spring ‘ s support uden for boksen. Se “JPA installation og opsætning” nedenfor for en demonstration af både manuel og Fjederbaseret JPA installation og opsætning.

data persistens i Java

fra et programmeringsperspektiv er ORM-laget et adapterlag: det tilpasser sproget for objektgrafer til sproget i tekst og relationelle tabeller. ORM-laget giver objektorienterede udviklere mulighed for at opbygge programmer, der fortsætter data uden nogensinde at forlade det objektorienterede paradigme.

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

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

for at gøre alt dette mere konkret skal du overveje at liste 1, som er en simpel dataklasse til modellering af en musiker.

liste 1. En simpel dataklasse i Java

Musician klasse i notering 1 bruges til at holde data. Det kan indeholde primitive data såsom feltet Navn. Det kan også holde relationer til andre klasser som mainInstrumentog performances.

Musician‘S grund til at være er at indeholde data. Denne type klasse er undertiden kendt som et Dto-eller dataoverførselsobjekt. Dto ‘ er er et fælles træk ved udvikling af programmer. Mens de har mange slags data, indeholder de ikke nogen forretningslogik. Vedvarende dataobjekter er en allestedsnærværende udfordring i udvikling af programmer.

data persistens med JDBC

en måde at gemme en forekomst afMusician klasse til en relationsdatabase ville være at bruge jdbc-biblioteket. JDBC er et lag af abstraktion, der lader en applikation udstede kommandoer uden at tænke på den underliggende databaseimplementering.

liste 2 viser, hvordan du kan fortsætteMusician klasse ved hjælp af JDBC.

Liste 2. Jdbc indsættelse af en post

koden i notering 2 er ret selvdokumenterende. georgeHarrison objektet kunne komme fra hvor som helst (front-end submit, ekstern service osv.), og har sit id og navn felter indstillet. Felterne på objektet bruges derefter til at angive værdierne for en sætninginsertPreparedStatement – klassen er en del af jdbc, der tilbyder en måde at anvende værdier sikkert på en KVM-forespørgsel.)

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

data persistens med JPA

overvej nu notering 3, hvor vi fortsætterMusician klasse ved hjælp af JPA.

Liste 3. Vedvarende George Harrison med JPA

Musician georgeHarrison = new Musician(0, "George Harrison");musicianManager.save(georgeHarrison);

liste 3 erstatter den manuelle KVL fra Liste 2 med en enkelt linje,session.save(), som instruerer JPA om at fortsætte objektet. Fra da af håndteres KVL-konverteringen af rammen, så du behøver aldrig at forlade det objektorienterede paradigme.

Metadata-anmærkninger i JPA

magien i notering 3 er resultatet af en konfiguration, der oprettes ved hjælp af JPA ‘ s anmærkninger. Udviklere bruger kommentarer til at informere JPA, hvilke objekter der skal vedvares, og hvordan de skal vedvares.

notering 4 viser Musician klasse med en enkelt JPA annotation.

liste 4. JPA ‘ s @Entity annotation

@Entitypublic class Musician { // ..class body}

vedvarende objekter kaldes undertiden enheder. Vedhæftning @Entitytil en klasse som Musician informerer JPA om, at denne klasse og dens objekter skal opretholdes.

konfiguration af JPA

som de fleste moderne rammer omfatter JPA kodning efter konvention (også kendt som konvention over konfiguration), hvor rammen giver en standardkonfiguration baseret på branchens bedste praksis. Som et eksempel vil en klasse med navnet Musician blive kortlagt som standard til en databasetabel kaldet musiker.

den konventionelle konfiguration er en timesaver, 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 ‘ s @Table annotation til at angive tabellen, hvor Musician klassen skal gemmes.

Liste 5. JPA ‘s @Table annotation

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

notering 5 fortæller JPA at fortsætte enheden (Musicianklasse) tilmusician tabel.

primær nøgle

i JPA er den primære nøgle det felt, der bruges til entydigt at identificere hvert objekt i databasen. Den primære nøgle er nyttig til at henvise til og relatere 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 notering 6 fortæller vi JPA, hvilket felt der skal bruges somMusician ‘s primære nøgle.

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

@Entitypublic class Musician { @Id private Long id;

i dette tilfælde har vi brugt JPA’s@Idannotation til at specificereidfelt somMusician ‘ 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 persistenskortlægning, du måtte have 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 har brug for for at oprette, hente, slette og opdatere denne klasse i databasen. Opkald session.save() opretter eller opdaterer den angivne klasse, afhængigt af om primærnøglefeltet er null eller gælder for en eksisterende enhed. Opkald entityManager.remove() sletter den angivne klasse.

Enhedsrelationer i JPA

simpelthen vedvarende 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 enhedsrelationer 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. For eksempel kanMusician enheden have et en-til-mange forhold tilPerformance, en enhed repræsenteret af en samling somList ellerSet.

HvisMusician inkluderede etBand felt, kan forholdet mellem disse enheder være mange-til-en, hvilket indebærer indsamling af MusicianS på singlen Band klasse. (Forudsat at hver musiker kun optræder i et enkelt band.)

HvisMusician inkluderet etBandMates felt, der kunne repræsentere et mange-til-mange forhold til andreMusician enheder.

endeligMusiciankan have et en-til-en-forhold til enQuoteenhed, der bruges til at repræsentere et berømt citat:Quote famousQuote = new Quote().

definition af relationstyper

JPA har anmærkninger for hver af dens relationskortlægningstyper. Liste 7 viser, hvordan du kan kommentere en-til-mange-forholdet mellem Musician og PerformanceS.

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

en ting at bemærke er, at @JoinColumn fortæller JPA, hvilken kolonne på Ydelsestabellen vil kortlægge til Musician enhed. Hver præstation vil blive knyttet til en enkelt Musician, som spores af denne kolonne. Når JPA indlæser en Musicianeller enPerformance i databasen, vil den bruge disse oplysninger til at rekonstituere objektgrafen.

Hentningsstrategier i JPA

ud over at vide, hvor relaterede enheder skal placeres i databasen, skal JPA vide, hvordan du vil have dem indlæst. Hentningsstrategier fortæller JPA, hvordan man indlæser relaterede enheder. Ved indlæsning og lagring af objekter skal en JPA-ramme give mulighed for at finjustere, hvordan objektgrafer håndteres. For eksempel, hvis Musician klassen har et bandMate felt (som vist i Liste 7), indlæser george kan forårsage, at hele Musikertabellen indlæses fra databasen!

det, der er nødvendigt, er evnen til at definere doven indlæsning af relaterede enheder-anerkender selvfølgelig, at relationer i JPA kan være ivrige eller dovne. Du kan bruge kommentarer til at tilpasse dine hentningsstrategier, men JPA ‘ s standardkonfiguration fungerer ofte ud af boksen uden ændringer:

  1. en-til-mange: doven
  2. mange-til-en: ivrig
  3. mange-til-mange: doven
  4. en-til-en: ivrig

JPA installation og opsætning

Vi afslutter med et hurtigt kig på installation og opsætning JPA til dine Java-applikationer. Til denne demonstration bruger jeg EclipseLink, JPA-referenceimplementeringen.

den almindelige måde at installere JPA på er at inkludere en JPA-udbyder i dit projekt. Notering 8 viser, hvordan du vil inkludere EclipseLink som en afhængighed i din Maven pom.xml fil.

Liste 8. Inkluder EclipseLink som en Maven-afhængighed

org.eclipse.persistenceeclipselink2.5.0-RC1

Du skal også medtage driveren til din database, som vist i Liste 9.

liste 9.

mysqlmysql-connector-java5.1.32

Dernæst skal du fortælle systemet om din database og udbyder. Dette gøres i persistence.xml filen, som vist i notering 10.

Liste 10. Vedholdenhed.der er andre måder at give disse oplysninger til systemet, herunder programmatisk. Jeg anbefaler at bruge persistence.xml – filen, fordi lagring af afhængigheder på denne måde gør det meget nemt at opdatere din applikation uden at ændre kode.

Fjederkonfiguration til JPA

brug af fjeder vil i høj grad lette integrationen af JPA i din applikation. Som et eksempel instruerer placering af @SpringBootApplication annotation i din applikationsoverskrift Spring til automatisk at scanne efter klasser og injicere EntityManager efter behov, baseret på den konfiguration, du har angivet.

liste 11 viser de afhængigheder, der skal medtages, hvis du vil have Spring ‘ s JPA-support til din ansøgning.

liste 11. Tilføjelse af Spring JPA-understøttelse i Maven

konklusion

hver applikation, der beskæftiger sig med en database, skal definere et applikationslag, hvis eneste formål er at isolere persistenskode. Som du har set i denne artikel, introducerer Java Persistence API en række funktioner og support til Java object persistence. Enkle applikationer kræver muligvis ikke alle JPA ‘ s muligheder, og i nogle tilfælde er overhead ved Konfiguration af rammen muligvis ikke fortjent. Som en ansøgning vokser, men JPA struktur og indkapsling virkelig tjene deres holde. Brug af JPA holder din objektkode enkel og giver en konventionel ramme for adgang til data i Java-applikationer.

Lær mere om Java Persistence API og relaterede teknologier

  • hvad er JDBC? Introduktion til Java-databaseforbindelse: Lær Java ‘ s API på lavt niveau at kende til at oprette forbindelse til en database, udstede forespørgsler og meget mere.Java persistens med JPA og Hibernate, Del 1: enheder og relationer: kom i gang modellering enheder og relationer med Java 8 og Hibernate ORM.
  • Java persistens med JPA og Hibernate, Del 2: Praktisk praksis modellering mange-til-mange relationer og arv relationer i Java 8 og dvale ORM.implementering af tilstandsafhængig adfærd: en klassisk introduktion til tilstandsmønsteret og tilstandsafhængigheden i Java.
  • ivrig / doven indlæsning i dvaletilstand: hvordan man anvender ivrig og doven indlæsning i dvaletilstand.
  • JPA 2.2 bringer nogle meget forventede ændringer: en oversigt over specifikationsopdateringer i JPA 2.2, herunder forbedringer af CDI, bedre tilpasning til dato og klokkeslæt API og understøttelse af @Repeatable annoteringer.
  • skal du bruge JPA til dit næste projekt?: Centrale spørgsmål, der kan hjælpe dig med at beslutte.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *