når folk er nye TIL JPA, Hibernate eller EclipseLink, blir de ofte forvirret om forskjellen mellom dem og hvilken de skal bruke i prosjektet. Hvis du er en av dem, ikke bekymre deg. Det er mye enklere enn det virker.
La oss ta en titt på jpa-spesifikasjonen først.
Java Persistence API (JPA)
JPA ER en forkortelse som står For Java Persistence API. Det er en spesifikasjon som er en del Av Java EE og definerer EN API for objektrelasjonelle tilordninger og for å administrere vedvarende objekter. DU kan bruke DENNE API I Java SE og Java ee miljøer.
spesifikasjonen er for tiden tilgjengelig i versjon 2.2. Du kan laste ned dokumentet på https://jcp.org/en/jsr/detail?id=338. API-krukken er tilgjengelig på Følgende maven-koordinater:
<dependency> <groupId>javax.persistence</groupId> <artifactId>javax.persistence-api</artifactId> <version>2.2</version></dependency>
JPA selv gir ingen implementeringsklasser. API jar inneholder bare et sett med grensesnitt som du kan bruke til å implementere utholdenhet lag. MEN DU kan ikke bruke JPA alene. Du trenger EN jpa-leverandør som implementerer spesifikasjonen. Det finnes flere alternativer tilgjengelig. De mest populære Er Hibernate Og EclipseLink. Men mer om det senere.INNTIL nylig ble JPA administrert og utviklet av en ekspertgruppe etter Java Community Process (JCP). Det endret seg da Oracle annonserte å overføre Alle Java EE-spesifikasjoner til Eclipse Foundation. Vi er nå midt i overgangsprosessen, og en ny spesifikasjonsprosess vil snart bli definert.
hva er definert AV jpa-spesifikasjonen
spesifikasjonen definerer de fleste funksjonene som jeg forklarte i opplæringsprogrammer og videoer på dette nettstedet. Du kan bruke dem med alle kompatible jpa implementeringer.
La oss ta en titt på noen av de viktigste.
Bootstrapping og basic entity mappings
Før DU kan begynne å bruke JPA, må du legge den til prosjektet, konfigurere en utholdenhet enhet, kart enheter til databasetabeller og bootstrap det. Du vet sikkert allerede hvordan du gjør det, og jeg forklarte det i detalj i Min Komme i Gang med Hibernate-artikkel.
Så, la oss hoppe over denne delen her og snakke om de mer interessante funksjonene.
Tilordning Av Assosiasjoner
JPA gjør DET ikke bare mulig å tilordne enkle enhetsattributter til databasekolonner, men du kan også tilordne assosiasjoner mellom databasetabeller til enhetsattributter.
@Entitypublic class Review {...@ManyToOneprivate Book book;...}
som ofte gjør enhetsmodellen veldig behagelig å bruke fordi du bare trenger å ringe en getter-metode på en enhet for å laste de tilknyttede enhetene. I bakgrunnen utfører vedvarende leverandøren alle nødvendige databaseoperasjoner for å hente og administrere tilknytningen.
så behagelig å bruke som dette kan være, forårsaker disse funksjonene ofte ytelsesproblemer. Før du begynner å modellere foreninger mellom enhetene dine, må du sørge for at du forstår effekten AV JPAS FetchTypes for å unngå n+1 select-problemer.
Jpql og Innfødte Spørringer
jpa definerer sitt eget spørrespråk, KALT JPQL. DET ligner PÅ SQL, men lar deg definere spørringer basert på den tilordnede domenemodellen i stedet for databasens tabellmodell.
følgende kodebit viser en enkel jpql-spørring. Du kan definere en ad hoc-spørring ved å kalle createQuery-metoden på EntityManager em. Som du kan se, ser syntaksen veldig ut SOM SQL. Hvis DU ikke er kjent MED JPQL, vennligst ta en titt på MIN Jpql Guide der jeg forklarer sin syntaks og evner i flotte detaljer.
TypedQuery<Book> q = em.createQuery("SELECT b FROM Book b WHERE b.id = :id", Book.class);q.setParameter("id", 1L);Book b = q.getSingleResult();
når du utfører en slik spørring, tolker utholdenhetsleverandøren jpql-setningen og genererer EN SQL-spørring for den. Ved å gjøre det, tilpasser utholdenhet leverandøren spørringen til database-spesifikke SQL dialekt og forbedrer portabilitet av programmet.
Dessverre begrenser det deg også til spørringsfunksjonene definert av spesifikasjonen eller proprietært støttet av din vedvarende leverandør. Dette funksjonssettet er betydelig mindre enn DET SOM TILBYS AV SQL, og inkluderer ikke noen proprietære databasefunksjoner.
Men det betyr Ikke at du ikke kan bruke avanserte eller komplekse spørringer med JPA. Den er utformet som en lekk abstraksjon og lar deg utføre innfødte SQL-spørringer. Disse analyseres ikke av utholdenhetsleverandøren din, og du kan bruke alle funksjoner som støttes av databasen din. Men vær oppmerksom på at dette kan påvirke databasens portabilitet negativt.
Å Utføre en innfødt spørring er ganske enkelt. Du trenger bare å ringe createNativeQuery-metoden i stedet for createQuery-metoden på EntityManager med en innfødt SQL-spørring.
Query q = em.createNativeQuery("SELECT * FROM book b WHERE id = :id", Book.class);q.setParameter("id", 1L);Book b = (Book) q.getSingleResult();
Egendefinerte Datatyper
JPA-spesifikasjonen definerer tilordningen for de fleste standardtyper uten å begrense deg til dem. SIDEN JPA 2.1, kan du enkelt støtte egendefinerte datatyper med En AttributeConverter. Du trenger bare å implementere AttributeConverter-grensesnittet og annotere klassen med en @ Converter-merknad.
her er et eksempel på en attributtkonverter som definerer en tilpasset tilordning for Min AuthorStatus enum.
@Converter(autoApply = true)public class AuthorStatusConverter implements AttributeConverter<AuthorStatus, String> {Logger log = Logger.getLogger(AuthorStatusConverter.class.getSimpleName());@Overridepublic String convertToDatabaseColumn(AuthorStatus status) {switch (status) {case NOT_PUBLISHED:logDbConversion(status, "N");return "N";case PUBLISHED:logDbConversion(status, "P");return "P";case SELF_PUBLISHED:logDbConversion(status, "S");return "S";default:throw new IllegalArgumentException("AuthorStatus not supported.");}}@Overridepublic AuthorStatus convertToEntityAttribute(String dbData) {switch (dbData) {case "N":logEntityConversion(AuthorStatus.NOT_PUBLISHED, "N");return AuthorStatus.NOT_PUBLISHED;case "P":logEntityConversion(AuthorStatus.PUBLISHED, "P");return AuthorStatus.PUBLISHED;case "S":logEntityConversion(AuthorStatus.SELF_PUBLISHED, "S");return AuthorStatus.SELF_PUBLISHED;default:throw new IllegalArgumentException("AuthorStatus not supported.");}}private void logDbConversion(AuthorStatus status, String dbData) {log.debug("Convert AuthorStatus enum to .");}private void logEntityConversion(AuthorStatus status, String dbData) {log.debug("Convert DB value to AuthorStatus enum .");}}
EclipseLink og Hibernate
som jeg sa før, trenger DU EN jpa-leverandør, hvis DU vil bruke jpa-spesifikasjonen i prosjektet ditt. Den implementerer grensesnittene som definert av spesifikasjonen. De mest populære Er EclipseLink Og Hibernate.en fordel med den standardiserte API levert AV JPA er at DU bare trenger å legge til implementeringen ved kjøring, og at du kan erstatte den med en annen uten å endre noen kode. Den standardiserte API gjør EclipseLink og Hibernate utskiftbare.
Så hvorfor trenger du forskjellige implementeringer?
jpa-implementeringene administreres av uavhengige team, og du kan velge den som gir best ytelse eller støtte for applikasjons-og teknologistakken din. De skiller seg også ut ved å tilby ekstra, ikke-standardfunksjoner. Dette brukes ofte til å drive innovasjon. Dagens populære, proprietære funksjon kan være det første skrittet til neste tillegg TIL JPA-standarden. Ved å bruke noen av disse proprietære funksjonene, gjør det selvsagt mye vanskeligere å erstatte en bestemt jpa-implementering.
EclipseLink
EclipseLink Er JPAS referanseimplementering og implementerer jpa versjon 2.2. Det var en av de første prosjektene som ble en DEL AV EE4J.
den enkleste måten å legge EclipseLink til prosjektet er å bruke Følgende maven koordinater.
<dependency> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>2.7.1</version></dependency>
Interessante proprietære funksjoner
I tillegg til funksjonene definert AV jpa-standarden, Tilbyr EclipseLink også flere interessante, proprietære funksjoner, som:Håndtering av databaseendringshendelser
Hibernate
Hibernate Er Red Hats svært populære implementering av jpa-spesifikasjonen. Det implementerer nesten alle funksjoner definert AV JPA 2.2 og vil slippe en fullt kompatibel versjon snart.
følgende maven avhengighet legger Dvalemodus til prosjektet.
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.1.11</version></dependency>
Interessante proprietære funksjoner
I Likhet Med EclipseLink gir Hibernate en rekke interessante, proprietære funksjoner, som:
- Utvidet støtte for naturlige IDs
- Laster flere enheter av deres primære nøkkel
- Administrasjon av opprettings-og oppdateringstidsstempler
- Bli med i ikke-tilknyttede enheter i spørringer
- støtte for flere leieforhold