Vad är JPA? Introduktion till Java Persistens API

som en specifikation handlar Java Persistens API om persistens, vilket löst betyder vilken mekanism som Java-objekt överlever applikationsprocessen som skapade dem. Inte alla Java-objekt behöver kvarstå, men de flesta applikationer kvarstår viktiga affärsobjekt. Med JPA-specifikationen kan du definiera vilka objekt som ska bestå och hur dessa objekt ska kvarstå i dina Java-applikationer.

i sig är JPA inte ett verktyg eller ramverk; snarare definierar den en uppsättning begrepp som kan implementeras av något verktyg eller ramverk. Medan JPA: s object-relational mapping (ORM) – modell ursprungligen baserades på viloläge, har den sedan dess utvecklats. På samma sätt, medan JPA ursprungligen var avsedd att användas med relations – /SQL-databaser, har vissa JPA-implementeringar utvidgats för användning med NoSQL-datalager. Ett populärt ramverk som stöder JPA med NoSQL är EclipseLink, referensimplementeringen för JPA 2.2.

JPA och Hibernate

På grund av deras sammanflätade historia är Hibernate och JPA ofta sammanfogade. Men som Java Servlet-specifikationen har JPA skapat många kompatibla verktyg och ramar; Hibernate är bara en av dem.Hibernate utvecklades av Gavin King och släpptes i början av 2002 och är ett ORM-bibliotek för Java. King utvecklade Hibernate som ett alternativ till entity beans för uthållighet. Ramverket var så populärt, och så behövde vid den tiden, att många av dess tankar antogs och kodifierades i den första JPA-specifikationen.idag är Hibernate ORM en av de mest mogna JPA-implementeringarna, och fortfarande ett populärt alternativ för ORM i Java. Viloläge ORM 5.3.8 (den nuvarande versionen från och med detta skrivande) implementerar JPA 2.2. Dessutom har hibernates verktygsfamilj utvidgats till att omfatta populära verktyg som Hibernate Search, Hibernate Validator och Hibernate OGM, som stöder domänmodellens uthållighet för NoSQL.

Vad är Java ORM?

medan de skiljer sig åt i utförandet, ger varje JPA-implementering någon form av ORM-lager. För att förstå JPA och JPA-kompatibla verktyg måste du ha ett bra grepp om ORM.

Objektrelationell kartläggning är en uppgift som utvecklare har goda skäl att undvika att göra manuellt. En ram som Hibernate ORM eller EclipseLink kodifierar den uppgiften till ett bibliotek eller ramverk, ett ORM-lager. Som en del av applikationsarkitekturen ansvarar ORM-lagret för att hantera omvandlingen av programvaruobjekt för att interagera med tabellerna och kolumnerna i en relationsdatabas. I Java konverterar ORM-lagret Java-klasser och objekt så att de kan lagras och hanteras i en relationsdatabas.

som standard blir namnet på objektet som kvarstår namnet på tabellen och fält blir kolumner. När tabellen är inställd motsvarar varje tabellrad ett objekt i applikationen. Objektmappning kan konfigureras, men standardvärden tenderar att fungera bra.

Figur 1 illustrerar JPA: s och ORM-lagrets roll i applikationsutvecklingen.

JavaWorld / IDG

Figur 1. JPA och ORM-lagret

konfigurera Java ORM-lagret

När du konfigurerar ett nytt projekt för att använda JPA måste du konfigurera datastore-och JPA-leverantören. Du konfigurerar en datastore-kontakt för att ansluta till din valda databas (SQL eller NoSQL). Du kommer också att inkludera och konfigurera JPA-leverantören, som är ett ramverk som Hibernate eller EclipseLink. Medan du kan konfigurera JPA manuellt väljer många utvecklare att använda Spring ’ s out-of-the-box support. Se ”JPA installation and setup” nedan för en demonstration av både manuell och Fjäderbaserad JPA installation och installation.

data persistens i Java

ur ett programmeringsperspektiv är ORM-lagret ett adapterlager: den anpassar språket i objektgrafer till språket i SQL och relationella tabeller. ORM-skiktet tillåter objektorienterade utvecklare att bygga programvara som kvarstår data utan att någonsin lämna det objektorienterade paradigmet.

När du använder JPA skapar du en karta från datalagret till programmets datamodellobjekt. Istället för att definiera hur objekt sparas och hämtas definierar du mappningen mellan objekt och databasen och åberopar sedan JPA för att fortsätta dem. Om du använder en relationsdatabas hanteras mycket av den faktiska anslutningen mellan din programkod och databasen av JDBC, Java Database Connectivity API.

som spec tillhandahåller JPA metadataanteckningar, som du använder för att definiera mappningen mellan objekt och databasen. Varje JPA-implementering ger sin egen motor för JPA-anteckningar. JPA spec ger också PersistanceManagereller EntityManager, som är de viktigaste kontaktpunkterna med JPA-systemet (där din affärslogikkod berättar för systemet vad man ska göra med de mappade objekten).

för att göra allt detta mer konkret, överväga att lista 1, vilket är en enkel dataklass för att modellera en musiker.

Lista 1. En enkel dataklass i Java

Musician klass i Lista 1 används för att hålla data. Den kan innehålla primitiva data som namnfältet. Det kan också hålla relationer till andra klasser som mainInstrumentoch performances.

Musician s anledning till att vara är att innehålla data. Denna typ av klass kallas ibland ett dto eller dataöverföringsobjekt. Dto är ett vanligt inslag i mjukvaruutveckling. Medan de har många typer av data innehåller de ingen affärslogik. Ihållande dataobjekt är en allestädes närvarande utmaning i mjukvaruutveckling.

data persistens med JDBC

ett sätt att spara en instans avMusician klassen till en relationsdatabas skulle vara att använda JDBC-biblioteket. JDBC är ett lager av abstraktion som låter en applikation utfärda SQL-kommandon utan att tänka på den underliggande databasimplementeringen.

Lista 2 visar hur du kan fortsätta klassenMusician med JDBC.

Lista 2. JDBC infoga en post

koden i Lista 2 är ganska självdokumenterande. georgeHarrison – objektet kan komma var som helst (front-end submit, extern tjänst etc.), och har sina ID-och namnfält inställda. Fälten på objektet används sedan för att ange värdena för ett SQL insert – uttalande. (Klassen PreparedStatement är en del av JDBC och erbjuder ett sätt att säkert tillämpa värden på en SQL-fråga.)

medan JDBC tillåter kontrollen som följer med manuell konfiguration, är det besvärligt jämfört med JPA. För att ändra databasen måste du först skapa en SQL-fråga som mappas från ditt Java-objekt till tabellerna i en relationsdatabas. Du måste sedan ändra SQL när en objektsignatur ändras. Med JDBC blir underhållet av SQL en uppgift i sig.

data persistens med JPA

nu överväga notering 3, där vi fortsätterMusician klass med JPA.

Lista 3. Bestående George Harrison med JPA

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

Lista 3 ersätter den manuella SQL från Lista 2 med en enda rad, session.save(), som instruerar JPA att fortsätta objektet. Från och med då hanteras SQL-konverteringen av ramverket, så du behöver aldrig lämna det objektorienterade paradigmet.

metadataanteckningar i JPA

magin i Lista 3 är resultatet av en konfiguration, som skapas med JPA: s anteckningar. Utvecklare använder anteckningar för att informera JPA vilka objekt som ska kvarstå och hur de ska kvarstå.

lista 4 visar klassen Musician med en enda JPA-anteckning.

lista 4. JPA: s @Entity annotation

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

beständiga objekt kallas ibland entiteter. Att fästa @Entitytill en klass som Musician informerar JPA om att denna klass och dess objekt ska bestå.

konfigurera JPA

liksom de flesta moderna ramar omfattar JPA kodning enligt konvention (även känd som konvention över konfiguration), där ramverket ger en standardkonfiguration baserad på branschens bästa praxis. Som ett exempel skulle en klass som heter Musician som standard mappas till en databastabell som heter musiker.

den konventionella konfigurationen är en tidsbesparing, och i många fall fungerar den tillräckligt bra. Det är också möjligt att anpassa din JPA-konfiguration. Som ett exempel kan du använda JPA: s @Table – anteckning för att ange tabellen där Musician – klassen ska lagras.

Lista 5. JPA: s @Table annotation

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

notering 5 berättar för JPA att fortsätta enheten (Musician klass) till musician tabell.

primärnyckel

i JPA är primärnyckeln det fält som används för att unikt identifiera varje objekt i databasen. Den primära nyckeln är användbar för att referera till och relatera objekt till andra enheter. När du lagrar ett objekt i en tabell anger du också fältet som ska användas som primärnyckel.

i Lista 6 berättar vi för JPA vilket fält som ska användas som Musician primärnyckel.

lista 6. Ange primärnyckeln

@Entitypublic class Musician { @Id private Long id;

i det här fallet har vi använt JPA: s @Id anteckning för att ange id fält som Musicianprimärnyckel. Som standard antar den här konfigurationen att primärnyckeln kommer att ställas in av databasen-till exempel när fältet är inställt på automatisk ökning på bordet.

JPA stöder andra strategier för att generera ett objekts primära nyckel. Det har också anteckningar för att ändra enskilda fältnamn. I allmänhet är JPA tillräckligt flexibel för att anpassa sig till varje uthållighetskartläggning du kan behöva.

CRUD operations

När du har mappat en klass till en databastabell och etablerat sin primära nyckel har du allt du behöver för att skapa, Hämta, ta bort och uppdatera den klassen i databasen. Att ringa session.save() skapar eller uppdaterar den angivna klassen, beroende på om primärnyckelfältet är null eller gäller för en befintlig entitet. Om du ringer entityManager.remove() raderas den angivna klassen.

Entitetsförhållanden i JPA

att helt enkelt bestå ett objekt med ett primitivt fält är bara hälften av ekvationen. JPA har också förmågan att hantera enheter i förhållande till varandra. Fyra typer av entitetsrelationer är möjliga i både tabeller och objekt:

    1. en-till-många
    2. många-till-en
    3. många-till-många
    4. en-till-en

varje typ av relation beskriver hur en enhet relaterar till andra enheter. Till exempel kanMusician entitet ha en en-till-många relation medPerformance, en enhet som representeras av en samling somList ellerSet.

om fältetMusician inkluderade ettBand kan förhållandet mellan dessa enheter vara många till en, vilket innebär samling av Musician s på singeln Band klass. (Förutsatt att varje musiker bara uppträder i ett enda band.)

omMusician inkluderade ettBandMates fält, som kan representera en många till många relation med andraMusician enheter.

slutligen kan Musician ha en en-till-en-relation med en Quote entitet, som används för att representera ett känt citat: Quote famousQuote = new Quote().

definiera relationstyper

JPA har anteckningar för var och en av sina relationsmappningstyper. Lista 7 visar hur du kan kommentera en-till-många-förhållandet mellan Musician och Performances.

lista 7. Kommentera en en-till-många relation

en sak att märka är att @JoinColumn berättar JPA vilken kolumn på Prestandatabellen kommer att mappas till Musician entitet. Varje prestanda kommer att associeras med en enda Musician, som spåras av denna kolumn. När JPA laddar en Musicianeller en Performance I databasen, kommer den att använda denna information för att återskapa objektgrafen.

hämta strategier i JPA

förutom att veta var du ska placera relaterade enheter i databasen måste JPA veta hur du vill att de ska laddas. Hämta strategier berätta JPA hur man laddar relaterade enheter. När du laddar och sparar objekt måste ett JPA-ramverk ge möjlighet att finjustera hur objektgrafer hanteras. Till exempel, omMusician klassen har enbandMate fält (som visas i notering 7), lastninggeorge kan orsaka hela Musikerbordet laddas från databasen!

vad som behövs är förmågan att definiera Lat laddning av relaterade enheter-erkänner naturligtvis att relationer i JPA kan vara ivriga eller lata. Du kan använda Anteckningar för att anpassa dina hämtningsstrategier, men JPA: s standardkonfiguration fungerar ofta ur lådan, utan ändringar:

  1. One-to-many: Lazy
  2. Many-to-many: Eager
  3. One-to-one: Eager

JPA installation och installation

Vi avslutar med en snabb titt på installation och inställning av JPA för dina Java-applikationer. För denna demonstration använder jag EclipseLink, JPA-referensimplementeringen.

det vanliga sättet att installera JPA är att inkludera en JPA-leverantör i ditt projekt. Notering 8 visar hur du skulle inkludera EclipseLink som ett beroende i din Maven pom.xml fil.

lista 8. Inkludera EclipseLink som ett Maven-beroende

org.eclipse.persistenceeclipselink2.5.0-RC1

Du måste också inkludera drivrutinen för din databas, som visas i lista 9.

lista 9. Maven dependency för en MySql-kontakt

mysqlmysql-connector-java5.1.32

Därefter måste du berätta för systemet om din databas och leverantör. Detta görs i filen persistence.xml, som visas i Lista 10.

lista 10. Uthållighet.xml

det finns andra sätt att tillhandahålla denna information till systemet, inklusive programmatiskt. Jag rekommenderar att du använder filen persistence.xml eftersom lagring av beroenden på detta sätt gör det väldigt enkelt att uppdatera din applikation utan att ändra kod.

Fjäderkonfiguration för JPA

med våren kommer det att underlätta integrationen av JPA i din applikation. Om du till exempel placerar @SpringBootApplication – anteckningen i programhuvudet instruerar Spring att automatiskt söka efter klasser och injicera EntityManager efter behov, baserat på den konfiguration du har angett.

lista 11 visar beroenden som ska inkluderas om du vill ha vårens JPA-stöd för din ansökan.

lista 11. Lägga våren JPA stöd i Maven

slutsats

varje program som behandlar en databas bör definiera ett program lager vars enda syfte är att isolera uthållighet kod. Som du har sett i den här artikeln introducerar Java Persistens API en rad funktioner och stöd för Java object persistens. Enkla applikationer kanske inte kräver alla JPA: s funktioner, och i vissa fall kanske overhead för att konfigurera ramverket inte meriteras. När en applikation växer, tjänar JPA: s struktur och inkapsling verkligen sin behållning. Att använda JPA håller objektkoden enkel och ger en konventionell ram för åtkomst till data i Java-applikationer.

Läs mer om Java Persistens API och relaterad teknik

  • Vad är JDBC? Introduktion till Java Database Connectivity: lär känna Java: s API på låg nivå för anslutning till en databas, utfärdande av SQL-frågor och mer.
  • Java persistens med JPA och Hibernate, Del 1: entiteter och relationer: kom igång modelleringsenheter och relationer med Java 8 och Hibernate ORM.
  • Java persistens med JPA och viloläge, del 2: Praktisk övning modellerar många till många relationer och arvsrelationer i Java 8 och viloläge ORM.
  • implementera statligt beroende beteende: en klassisk introduktion till tillståndsmönstret och tillståndsberoende i Java.
  • Eager / Lazy Loading In Hibernate: hur man ansöker eager och lazy loading in Hibernate.
  • JPA 2.2 ger några mycket förväntade förändringar: en översikt över specifikationsuppdateringar i JPA 2.2, inklusive förbättringar av CDI, bättre anpassning till datum och tid API, och stöd för @Repeatable anteckningar.
  • ska du använda JPA för ditt nästa projekt?: Viktiga frågor som kan hjälpa dig att bestämma.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *