Vlad Mihalcea

Sist endret:

Tenk deg å ha et verktøy som automatisk kan oppdage jpa og Dvalemodus ytelsesproblemer. Hypersistence Optimizer er det verktøyet!

Introduksjon

hvis du lurer på hvorfor og når du skal bruke JPA eller Hibernate, vil denne artikkelen gi deg et svar på dette svært vanlige spørsmålet. Fordi jeg har sett dette spørsmålet veldig ofte på / r / java Reddit-kanalen, bestemte jeg meg for at det er verdt å skrive et grundig svar om styrken OG svakhetene TIL JPA og Hibernate.

SELV OM JPA har vært en standard siden DEN først ble utgitt i 2006, er DET ikke den eneste måten du kan implementere et datatilgangslag ved Hjelp Av Java. Vi skal diskutere fordeler og ulemper ved å bruke JPA eller andre populære alternativer.

Hvorfor OG når JDBC ble opprettet

I 1997, Java 1.1 introduserte JDBC (Java Database Connectivity) API, som var veldig revolusjonerende for sin tid siden det var å tilby muligheten til å skrive datatilgangslaget en gang ved hjelp av et sett med grensesnitt og kjøre det på en hvilken som helst relasjonsdatabase som implementerer JDBC API uten å måtte endre programkoden.

JDBC API tilbys et grensesnitt Connection for å kontrollere transaksjonsgrenser og opprette enkle SQL-setninger via API Statement ELLER forberedte setninger som lar deg binde parameterverdier via API PreparedStatement.

så, forutsatt at vi har en post databasetabell og vi vil sette inn 100 rader, slik kan VI nå dette målet MED JDBC:

int postCount = 100;int batchSize = 50;try (PreparedStatement postStatement = connection.prepareStatement(""" INSERT INTO post ( id, title ) VALUES ( ?, ? ) """)) { for (int i = 1; i <= postCount; i++) { if (i % batchSize == 0) { postStatement.executeBatch(); } int index = 0; postStatement.setLong( ++index, i ); postStatement.setString( ++index, String.format( "High-Performance Java Persistence, review no. %1$d", i ) ); postStatement.addBatch(); } postStatement.executeBatch();} catch (SQLException e) { fail(e.getMessage());}

mens vi tok fordel av Multi-line Tekstblokker og prøve-med-ressurser blokker for å eliminere PreparedStatement close samtale, er gjennomføringen fortsatt veldig ordrik. Merk at bindeparametrene starter fra 1, ikke 0 som du kanskje er vant til fra andre kjente Apier.

for å hente de første 10 radene, må vi kanskje kjøre EN SQL-spørring via PreparedStatement, som vil returnere et ResultSet som representerer det tabellbaserte spørringsresultatet. Siden programmer bruker hierarkiske strukturer, FOR EKSEMPEL JSON eller Dtoer, til å representere foreldre-barn-foreninger, behøvde de fleste programmer å transformere JDBC ResultSet til et annet format i datatilgangslaget, som illustrert i følgende eksempel:

int maxResults = 10;List<Post> posts = new ArrayList<>();try (PreparedStatement preparedStatement = connection.prepareStatement(""" SELECT p.id AS id, p.title AS title FROM post p ORDER BY p.id LIMIT ? """)) { preparedStatement.setInt(1, maxResults); try (ResultSet resultSet = preparedStatement.executeQuery()) { while (resultSet.next()) { int index = 0; posts.add( new Post() .setId(resultSet.getLong(++index)) .setTitle(resultSet.getString(++index)) ); } }} catch (SQLException e) { fail(e.getMessage());}

Igjen, dette er den fineste måten vi kunne skrive dette med JDBC som vi bruker Tekstblokker, prøve-med-ressurser, OG En Flytende-STIL API for å bygge Post objekter.

LIKEVEL ER JDBC API fortsatt veldig verbose og, enda viktigere, mangler mange funksjoner som kreves når man implementerer et moderne datatilgangslag, som:

  • en måte å hente objekter direkte fra spørringsresultatsettet. Som vi har sett i eksemplet ovenfor, må vi iterere ReusltSet og trekke ut kolonneverdiene for å angi objektegenskapene Post.
  • en gjennomsiktig måte å batchuttrykk uten å måtte omskrive datatilgangskoden når du bytter fra standard ikke-batching-modus til å bruke batching.
  • støtte for optimistisk låsing
  • et paginerings-API som skjuler den underliggende databasespesifikke top-N-og Next-N-spørringssyntaksen

Hvorfor Og når Hibernate ble opprettet

I 1999 lanserte Sun J2EE (Java Enterprise Edition), som tilbød et alternativ til JDBC, kalt Entity Beans.

Men Siden Entity Beans var notorisk treg, overkomplisert og tungvint å bruke, bestemte Gavin King i 2001 å lage ET ORM-rammeverk som kunne kartlegge databasetabeller Til POJOs( Vanlige Gamle Java-Objekter), og Det var Slik Hibernate ble født.

Å være mer lett enn Entity Bønner og mindre ordrik ENN JDBC, Hibernate vokste mer og mer populært, og det ble snart Den mest populære Java utholdenhet rammeverk, vinne OVER JDO, iBatis, Oracle TopLink, Og Apache Cayenne.

Hvorfor og når BLE JPA opprettet?

Læring Fra Hibernate prosjekt suksess, Java ee plattformen besluttet å standardisere måten Hibernate Og Oracle TopLink, og det er hvordan Jpa (Java Persistence API) ble født.

JPA er bare en spesifikasjon og kan ikke brukes alene, og gir bare et sett med grensesnitt som definerer standard persistence API, som implementeres av En JPA-leverandør, som Hibernate, EclipseLink eller OpenJPA.

når DU bruker JPA, må du definere tilordningen mellom en databasetabell og det tilknyttede Java-enhetsobjektet:

@Entity@Table(name = "post")public class Post { @Id private Long id; private String title; public Long getId() { return id; } public Post setId(Long id) { this.id = id; return this; } public String getTitle() { return title; } public Post setTitle(String title) { this.title = title; return this; }}

Etterpå kan vi omskrive det forrige eksemplet som lagret 100 post poster ser slik ut:

for (long i = 1; i <= postCount; i++) { entityManager.persist( new Post() .setId(i) .setTitle( String.format( "High-Performance Java Persistence, review no. %1$d", i ) ) );}

for å aktivere jdbc batch inserts, må vi bare gi en enkelt konfigurasjonsegenskap:

<property name="hibernate.jdbc.batch_size" value="50"/>

Når Denne egenskapen er oppgitt, Kan Hibernate automatisk bytte fra ikke-batching til batching uten å måtte endre datatilgangskode.

og for å hente de første 10 post – radene, kan vi utføre følgende jpql-spørring:

int maxResults = 10;List<Post> posts = entityManager.createQuery(""" select p from post p order by p.id """, Post.class).setMaxResults(maxResults).getResultList();

hvis du sammenligner dette MED jdbc-versjonen, vil DU se AT JPA er mye enklere å bruke.

fordelene og ulempene ved å bruke Jpa og Hibernate

JPA, generelt, Og Hibernate, spesielt, gir mange fordeler.

  • du kan hente enheter eller Dtoer. Du kan også hente hierarkisk foreldre-barn DTO projeksjon.
  • du kan aktivere jdbc-batching uten å endre datatilgangskoden.
  • du har støtte for optimistisk låsing.
  • du har en pessimistisk låsende abstraksjon som er uavhengig av den underliggende databasespesifikke syntaksen, slik at du kan skaffe DEG EN LESE-OG SKRIVELÅS eller TIL OG med EN HOPPLÅS.
  • Du har en database-uavhengig paginering API.
  • du kan angi en List av verdier til EN in query-setning, som forklart i denne artikkelen.
  • Du kan bruke en sterkt konsistent caching-løsning som lar Deg avlaste Den Primære noden, som for rea-write-transaksjoner bare kan kalles vertikalt.
  • du har innebygd støtte for revisjonslogging via Dvalemodus.
  • du har innebygd støtte for multitenancy.
  • du kan generere et innledende skjemaskript fra entity-tilordningene ved Hjelp Av Hibernate hbm2ddl-verktøyet, som du kan levere til et automatisk skjemamigreringsverktøy, for Eksempel Flyway.
  • Ikke bare at du har frihet til å utføre en opprinnelig SQL-spørring, men Du kan bruke SqlResultSetMapping til å transformere JDBC ResultSet TIL jpa-enheter eller Dtoer.

ulempene ved bruk AV JPA og Hibernate er følgende:

  • Mens komme i gang MED JPA er veldig enkelt, bli en ekspert krever en betydelig tid investering fordi, i tillegg til å lese manualen, du har fortsatt å lære hvordan databasesystemer fungerer, SQL standard samt den spesifikke SQL smaken som brukes av prosjektet relasjonsdatabase.
  • Det er noen mindre intuitive atferd som kan overraske nybegynnere, som flush operation order.
  • Kriteriene API er ganske detaljert, så du må bruke et verktøy som Codota for å skrive dynamiske spørringer lettere.

det generelle samfunnet og populære integrasjoner

Jpa og Hibernate er ekstremt populære. Ifølge 2018 Java ecosystem report Av Snyk, Hibernate brukes av 54% Av Alle Java-utviklere som samhandler med en relasjonsdatabase.

dette resultatet kan støttes Av Google Trends. For Eksempel, hvis Vi sammenligner Google-Trender FOR JPA over sine hovedkonkurrenter (F. Eks. MyBatis, QueryDSL og jOOQ), kan VI se AT JPA er mange ganger mer populært og viser ingen tegn på å miste sin dominerende markedsandelsposisjon.

 Hvorfor og når DU skal bruke JPA

Hvorfor og når du skal bruke JPA

Å være så populær gir mange fordeler, som:

  • Våren Data jpa integrasjon fungerer som en sjarm. Faktisk er En av de største grunnene til AT Jpa og Hibernate er så populære, Fordi Spring Boot bruker Spring Data JPA, som igjen bruker Hibernate bak kulissene.
  • hvis du har noe problem, er det en god sjanse for at disse 30k Hibernate-relaterte stackoverflow-svarene og 16k Jpa-relaterte stackoverflow-svarene gir deg en løsning.
  • det er 73k Hibernate tutorials tilgjengelig. Bare min side alene tilbyr over 250 jpa og Hibernate tutorials som lærer deg hvordan du får mest mulig ut AV JPA og Hibernate.
  • Det er mange video kurs du kan bruke også, som Min Høy Ytelse Java Utholdenhet video kurs.
  • Det er over 300 bøker Om Hibernate På Amazon, hvorav en er Min Høyytelses Java Persistence book også.

jpa-alternativer

En av De største tingene Med Java-økosystemet er overflod av høykvalitets rammer. Hvis Jpa og Hibernate ikke passer godt til ditt brukstilfelle, kan du bruke noen av følgende rammer:

  • MyBatis, som er en veldig lett SQL query mapper rammeverk.
  • QueryDSL, som lar deg bygge SQL, JPA, Lucene, Og MongoDB spørringer dynamisk.
  • jOOQ, som gir En Java metamodel for de underliggende tabellene, lagrede prosedyrer og funksjoner, og lar deg bygge EN SQL-spørring dynamisk ved hjelp av en svært intuitiv DSL og på en typesikker måte.

så bruk det som fungerer best for deg.

Online Workshops

hvis du likte denne artikkelen, vedder jeg på at du kommer til å elske min kommende 4-dagers x 4 timer Høy Ytelse Java Persistens Online Workshop

Konklusjon

i denne artikkelen så vi hvorfor JPA ble opprettet og når du skal bruke DEN. MENS JPA gir mange fordeler, har du mange andre høykvalitets alternativer å bruke hvis JPA og Hibernate ikke fungerer best for dine nåværende programkrav.

og noen ganger, som jeg forklarte i denne gratis prøven av Min Java-Utholdenhetsbok Med Høy Ytelse, trenger du ikke engang å velge MELLOM JPA eller andre rammer. Du kan enkelt kombinere JPA med et rammeverk som jOOQ for å få det beste fra begge verdener.

Transaksjoner og Samtidighetskontroll ebok

Høy Ytelse Java Utholdenhet bergarter!
Høy Ytelse Java Utholdenhet Online Workshop
Hypersistens Optimizer bergarter!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.