Introduksjon til Apache Cayenne ORM

1. Oversikt

Apache Cayenne er et open source-bibliotek, distribuert under Apache-lisensen, og tilbyr funksjoner som et modelleringsverktøy, objektrelasjonell kartlegging aka ORM for lokale utholdenhetsoperasjoner og fjerntjenester.

I de følgende avsnittene vil vi se hvordan du kan samhandle med en MySQL-database ved hjelp av Apache Cayenne ORM.

2. Maven-avhengigheter

For å starte, trenger vi bare å legge til følgende avhengigheter for å hente Apache Cayenne og MySQL-koblingen JDBC-driveren sammen for å få tilgang til intro_cayenne database:

 org.apache.cayenne cayenne-server 4.0.M5 mysql mysql-connector-java 5.1.44 kjøretid 

La oss konfigurere plugin-modul for Cayenne som skal brukes til å designe eller sette vår kartfil som fungerer som en bro mellom databaseskjemaet og Java-objektet:

 org.apache.cayenne.plugins maven-cayenne-modeler-plugin 4.0.M5 

I stedet for å bygge XML-mappefiler for hånd (laget sjelden), anbefales det å bruke modelleren som er et ganske avansert verktøy som følger med Cayenne-distribusjonen.

Den er tilgjengelig for nedlasting fra dette arkivet, avhengig av operativsystemet ditt, eller bare bruk plattformversjonen (JAR) som er inkludert som et Maven-plugin der oppe.

Maven Central repository er vert for de nyeste versjonene av Apache Cayenne, hans modellerer og MySQL Connector.

La oss deretter bygge prosjektet vårt med mvn installere og start modelleren GUI med kommandoen mvn cayenne-modeler: kjør for å få ut dette skjermbildet:

3. Oppsett

For å få Apache Cayenne til å slå opp den riktige lokale databasen, trenger vi bare å fylle konfigurasjonsfilen med riktig driver, URL og en bruker i filen cayenne-project.xml ligger i ressurser katalog:

Her kan vi se at:

  • Den lokale databasen heter intro_cayenne
  • Hvis den ennå ikke er opprettet, vil Cayenne gjøre det for oss
  • Vi kobler til med brukernavnet rot og passord rot (endre det i henhold til brukerne som er registrert i databasesystemet)

Internt er det XMLPoolingDataSourceFactory ansvarlig for lasting av JDBC-tilkoblingsinformasjon fra en XML-ressurs tilknyttet DataNodeDescriptor.

Vær oppmerksom på at disse parametrene er i forhold til databasestyringssystemet og en JDBC-driver fordi dette biblioteket kan støtte mange forskjellige databaser.

Hver av dem har et adapter tilgjengelig i denne detaljerte listen. Legg merke til at full dokumentasjon for versjon 4.0 ennå ikke er tilgjengelig, så vi refererer til forrige versjon her.

4. Kartlegging og databasedesign

4.1. Modellering

La oss nå klikke på “Åpent prosjekt”, naviger til prosjektets ressursmappe og velg filen cayenne-project.xml, modellereren vil vise dette:

Her, vi har valget om å enten lage kartstrukturen vår fra en eksisterende databaseeller for å fortsette manuelt. Denne artikkelen vil håndtere den som bruker modellereren og eksisterende database for å komme inn i Cayenne og vite raskt hvordan den fungerer.

La oss ta en titt på vår intro_cayenne database som har en en-til-mange forhold over to tabeller, ettersom forfatteren kan publisere eller eie mange artikler:

  • forfatter: id (PK) og Navn
  • artikkel: id (PK), tittel, innhold, og author_id (FK)

La oss nå gå til “Verktøy> Reengineer Database Schema“, Og vi vil fylle ut alle kartkonfigurasjonene våre automatisk. På ledetekstskjermen er det bare å fylle ut datakildekonfigurasjonen tilgjengelig der oppe i cayenne-project.xml fil og trykk på Fortsett:

På neste skjermbilde må vi sjekke "Bruk Java primitive typer" som følger:

Vi må også sørge for å sette com.baeldung.apachecayenne.persistent som Java-pakke og lagre den; Vi ser at XML-konfigurasjonsfilen er oppdatert for sin standardpakke egenskap som samsvarer med Java-pakken:

I hver Objekt vi må spesifisere pakken for underklasser som vist i det følgende bildet og klikke på "lagre" ikonet igjen:

Nå på “Verktøy> Generer klasser” menyen, velg “Standard vedvarende gjenstander”Som typen; og på “Klasser” fanen sjekk alle klasser og trykk "generere".

La oss gå tilbake til kildekoden for å se at de vedvarende objektene våre er generert, og snakker om _Artikkel.java og _Forfatter.java.

Merk at alle disse konfigurasjonene er lagret i filen datamap.map.xml ligger også i ressurser mappe.

4.2. Kartleggingsstruktur

Den genererte XML-kartfilen som presenteres i ressursmappen bruker noen unike koder i forhold til Apache Cayenne:

  • DataNode () - databasemodellen, innholdet i all informasjon som er nødvendig for å bli koblet til en database (navnet på databasen, driveren og brukerlegitimasjonen)
  • DataMap () - det er en beholder med vedvarende enheter med deres forhold
  • DbAttribute () - representerer en kolonne i en databasetabell
  • DbEntity () - modellen til en enkelt databasetabell eller -visning, den kan ha DbAttributter og relasjoner
  • ObjEntity () - modellen til en enkelt vedvarende java-klasse; laget av ObjAttributter som tilsvarer enhetsklasseegenskaper og ObjRelationships som er egenskaper som har en type annen enhet
  • Kan legges inn () - modellen til en Java-klasse som fungerer som en egenskap for en ObjEntity, men som tilsvarer flere kolonner i databasen
  • Fremgangsmåte() - for å registrere lagret prosedyre i databasen
  • Spørsmål() - modellen til et spørsmål, brukt til å kartlegge spørringen i konfigurasjonsfilen uten å glemme at vi også kan gjøre det i koden

Her er de fulle detaljene.

5. Cayenne API

Det eneste gjenværende trinnet er å bruke Cayenne API til å utføre databaseaksjonene våre ved hjelp av genererte klasser, vel vitende om at å underklasse våre vedvarende klasser bare er en god praksis som brukes for å tilpasse modellen senere.

5.1. Opprette et objekt

Her sparer vi bare en Forfatter innvende og sjekk senere at det bare er en post av denne typen i databasen:

@Test offentlig ugyldig nårInsert_thenWeGetOneRecordInTheDatabase () {Author author = context.newObject (Author.class); author.setName ("Paul"); context.commitChanges (); lange poster = ObjectSelect.dataRowQuery (Author.class) .selectCount (kontekst); assertEquals (1, poster); }

5.2. Lese et objekt

Etter å ha lagret en Forfatter, vi velger det bare blant annet via et enkelt spørsmål fra en bestemt eiendom:

@Test offentlig ugyldig nårInsert_andQueryByFirstName_thenWeGetTheAuthor () {Author author = context.newObject (Author.class); author.setName ("Paul"); context.commitChanges (); Forfatter expectedAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (kontekst); assertEquals ("Paul", expectAuthor.getName ()); }

5.3. Henter alle poster i en klasse

Vi skal lagre to forfattere og hente en samling forfatterobjekter for å kontrollere at det bare er disse to lagret:

@Test offentlig ugyldig nårInsert_andQueryAll_thenWeGetTwoAuthors () {Author firstAuthor = context.newObject (Author.class); firstAuthor.setName ("Paul"); Forfatter secondAuthor = context.newObject (Author.class); secondAuthor.setName ("Ludovic"); context.commitChanges (); Listeforfattere = ObjectSelect .query (Author.class) .select (context); assertEquals (2, author.size ()); }

5.4. Oppdatere et objekt

Oppdateringsprosessen er også enkel, men vi må først ha det ønskede objektet før vi endrer egenskapene og bruker det i databasen:

@Test offentlig ugyldig nårUpdating_thenWeGetAnUpatedeAuthor () {Author author = context.newObject (Author.class); author.setName ("Paul"); context.commitChanges (); Forfatter expectedAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (kontekst); expectAuthor.setName ("Garcia"); context.commitChanges (); assertEquals (author.getName (), expectAuthor.getName ()); }

5.5. Feste et objekt

Vi kan tildele en artikkel til en forfatter:

@Test offentlig ugyldig nårAttachingToArticle_thenTheRelationIsMade () {Author author = context.newObject (Author.class); author.setName ("Paul"); Artikkelartikkel = context.newObject (Article.class); article.setTitle ("Mitt innleggstitel"); article.setContent ("Innholdet"); article.setAuthor (forfatter); context.commitChanges (); Forfatter expectAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Smith")) .selectOne (kontekst); Article expectedArticle = (expectAuthor.getArticles ()). Get (0); assertEquals (article.getTitle (), expectedArticle.getTitle ()); }

5.6. Slette et objekt

Slettingen av et lagret objekt fjerner det fullstendig fra databasen, deretter får vi se null som et resultat av spørringen:

@Test offentlig ugyldig nårDeleting_thenWeLostHisDetails () {Author author = context.newObject (Author.class); author.setName ("Paul"); context.commitChanges (); Forfatter savedAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (kontekst); hvis (savedAuthor! = null) {context.deleteObjects (forfatter); context.commitChanges (); } Forfatter expectAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (context); assertNull (forventet forfatter); }

5.7. Slett alle poster i en klasse

Det er også mulig å slippe alle postene i en tabell ved hjelp avSQLTemplate, her gjør vi dette etter hver testmetode for alltid å ha en ugyldig database før hver test startes:

@Efter offentlig ugyldig deleteAllRecords () {SQLTemplate deleteArticles = ny SQLTemplate (Article.class, "slett fra artikkel"); SQLTemplate deleteAuthors = ny SQLTemplate (Forfatter.klasse, "slett fra forfatter"); context.performGenericQuery (deleteArticles); context.performGenericQuery (deleteAuthors); }

6. Konklusjon

I denne opplæringen fokuserte vi på å bruke Apache Cayenne ORM for å enkelt demonstrere hvordan du gjør CRUD-operasjoner med en en-til-mange forhold.

Som alltid kan kildekoden for denne artikkelen finnes på GitHub.


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