Uvod u Apache Cayenne ORM

1. Pregled

Apache Cayenne je biblioteka otvorenog koda, distribuirana pod licencom Apache, koja pruža značajke poput alata za modeliranje, objektno-relacijskog mapiranja zvanog ORM za lokalne operacije ustrajnosti i udaljenih usluga.

U sljedećim odjeljcima vidjet ćemo kako komunicirati s MySQL bazom podataka koristeći Apache Cayenne ORM.

2. Ovisnosti Mavena

Za početak trebamo dodati sljedeće ovisnosti da bismo zajedno otvorili Apache Cayenne i MySQL konektor JDBC upravljački program za pristup našem intro_cayenne baza podataka:

 org.apache.cayenne cayenne-server 4.0.M5 mysql mysql-connector-java 5.1.44 runtime 

Konfigurirajmo dodatak za modelar Cayenne koji će se koristiti za dizajniranje ili postavljanje naše datoteke preslikavanja koja djeluje kao most između sheme baze podataka i Java objekta:

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

Umjesto da ručno izrađujete XML datoteku za mapiranje (radi se rijetko), preporučuje se upotreba modela, koji je prilično napredan alat koji dolazi s Cayenneovom distribucijom.

Dostupno je za preuzimanje iz ove arhive, ovisno o vašem OS-u, ili jednostavno koristite verziju više platformi (JAR) koja je tamo uključena kao dodatak Maven.

U spremištu Maven Central smještene su najnovije verzije Apache Cayennea, njegovog modelara i MySQL Connector-a.

Dalje, gradimo svoj projekt s mvn instalirati i naredbom pokrenite GUI za modeliranje mvn cayenne-modeler: trči da biste dobili kao izlaz ovaj zaslon:

3. Postavljanje

Da bi Apache Cayenne potražio ispravnu lokalnu bazu podataka, samo moramo ispuniti njegovu konfiguracijsku datoteku pravim upravljačkim programom, URL-om i korisnikom u datoteci cayenne-project.xml smješten u resursi imenik:

Ovdje to možemo vidjeti:

  • Lokalna baza podataka je imenovana intro_cayenne
  • Ako još nije stvoren, Cayenne će to učiniti za nas
  • Povezati ćemo se pomoću korisničkog imena korijen i lozinku korijen (promijenite je prema korisnicima registriranim u vašem sustavu upravljanja bazom podataka)

Interno je to XMLPoolingDataSourceFactory odgovoran za učitavanje podataka o JDBC vezi iz XML resursa pridruženog DataNodeDescriptor.

Imajte na umu da su ovi parametri u odnosu na sustav upravljanja bazom podataka i JDBC pokretački program, jer ova knjižnica može podržavati mnogo različitih baza podataka.

Svatko od njih ima adapter dostupan na ovom detaljnom popisu. Primijetite da kompletna dokumentacija za verziju 4.0 još nije dostupna, pa se ovdje pozivamo na prethodnu verziju.

4. Mapiranje i dizajn baze podataka

4.1. Modeliranje

Kliknimo sada na “Otvoreni projekt”, dođite do mape resursa projekta i odaberite datoteku cayenne-project.xml, modelar će pokazati ovo:

Ovdje, imamo izbor ili stvoriti strukturu mapiranja iz postojeće baze podatakaili da nastavite ručno. Ovaj će se članak baviti onim koji koristi modelar i postojeću bazu podataka da bi ušao u Cayenne i brzo znao kako to radi.

Pogledajmo naše intro_cayenne baza podataka koja ima jedan prema mnogima odnos između dvije tablice, jer autor može objaviti ili biti vlasnik mnogih članaka:

  • autor: id (PK) i Ime
  • članak: id (PK), naslov, sadržaj, i autor_id (FK)

Sada idemo na “Alati> Reinženjerska shema baze podataka“, I automatski ćemo ispuniti sve naše konfiguracije mapiranja. Na zaslonu upita samo popunite konfiguraciju izvora podataka koja je dostupna tamo u programu cayenne-project.xml datoteka i pritisnite Nastavi:

Na sljedećem zaslonu moramo provjeriti "Koristi Java primitivne tipove" kako slijedi:

Moramo osigurati i stavljanje com.baeldung.apachecayenne.postojan kao Java paket i spremite ga; vidjet ćemo da je XML konfiguracijska datoteka ažurirana zbog svojeg zadani paket svojstvo koje odgovara Java paketu:

U svakom ObjEntity moramo navesti paket za podrazrede kao što je prikazano na sljedećoj slici i kliknuti na "uštedjeti" opet ikona:

Sad naprijed "Alati> Generiranje klasa" izbornika, odaberite “Standardni trajni objekti”Kao vrsta; i na "Predavanja" tab provjeri sve razrede i pogodi "generirati".

Vratimo se izvornom kodu da vidimo jesu li naši trajni objekti uspješno generirani, o čemu pričamo _Članak.java i _Autor.java.

Imajte na umu da su sve ove konfiguracije spremljene u datoteku datamap.map.xml koji se također nalazi u resursi mapu.

4.2. Mapiranje strukture

Generirana datoteka XML mapiranja predstavljena u mapi resursa koristi neke jedinstvene oznake u odnosu na Apache Cayenne:

  • DataNode () - model baze podataka, njezin sadržaj, svi podaci potrebni za povezivanje s bazom podataka (naziv baze podataka, pokretački program i korisničke vjerodajnice)
  • Karta podataka () - to je spremnik postojanih entiteta sa svojim odnosima
  • DbAttribute () - predstavlja stupac u tablici baze podataka
  • DbEntity () - model jedne tablice ili pogleda baze podataka, može imati DbAttribute i odnose
  • ObjEntity () - model jedne trajne java klase; napravljen od ObjAttributes koji odgovaraju svojstvima klase entiteta i ObjRelationships koji su svojstva koja imaju tip drugog entiteta
  • Ugradivo () - model Java klase koji djeluje kao svojstvo ObjEntity, ali odgovara više stupaca u bazi podataka
  • Postupak() - za registraciju pohranjene procedure u bazu podataka
  • Upit () - model upita, koji se koristi za mapiranje upita u konfiguracijskoj datoteci, ne zaboravljajući da to možemo učiniti i u kodu

Ovdje su sve pojedinosti.

5. API Cayenne

Jedini preostali korak je korištenje API-ja Cayenne za obavljanje operacija baze podataka pomoću generiranih klasa, znajući da je podklasiranje naših trajnih klasa samo najbolja praksa koja se kasnije koristi za prilagođavanje modela.

5.1. Stvaranje objekta

Ovdje samo spremimo Autor objekt i provjerite kasnije da li postoji samo jedan zapis ove vrste u bazi podataka:

@Test public void whenInsert_thenWeGetOneRecordInTheDatabase () {Autor autor = context.newObject (Autor.klasa); author.setName ("Paul"); context.commitChanges (); dugi zapisi = ObjectSelect.dataRowQuery (Autor.klasa) .selectCount (kontekst); assertEquals (1, zapisi); }

5.2. Čitanje predmeta

Nakon spremanja datoteke Autor, samo ga odabiremo između ostalih jednostavnim upitom određenog svojstva:

@Test public void whenInsert_andQueryByFirstName_thenWeGetTheAuthor () {Autor autor = context.newObject (Autor.klasa); author.setName ("Paul"); context.commitChanges (); Autor očekujeAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (context); assertEquals ("Paul", očekivaniAutor.getName ()); }

5.3. Dohvaćanje svih zapisa klase

Spremit ćemo dva autora i dohvatiti zbirku autorskih objekata kako bismo provjerili postoje li samo ova dva spremljena:

@Test public void whenInsert_andQueryAll_thenWeGetTwoAuthors () {Author firstAuthor = context.newObject (Author.class); firstAuthor.setName ("Paul"); Autor secondAuthor = context.newObject (Author.class); secondAuthor.setName ("Ludovic"); context.commitChanges (); Popis autora = ObjectSelect .query (Autor.class) .select (context); assertEquals (2, autori.size ()); }

5.4. Ažuriranje objekta

Postupak ažuriranja je također jednostavan, ali prvo moramo imati željeni objekt prije nego što izmijenimo njegova svojstva i primijenimo ga na bazu podataka:

@Test public void whenUpdating_thenWeGetAnUpatedeAuthor () {Autor autor = context.newObject (Autor.klasa); author.setName ("Paul"); context.commitChanges (); Autor očekujeAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (context); očekivaniAutor.setName ("Garcia"); context.commitChanges (); assertEquals (autor.getName (), očekivaniAutor.getName ()); }

5.5. Pričvršćivanje predmeta

Članak možemo dodijeliti autoru:

@Test public void whenAttachingToArticle_thenTheRelationIsMade () {Autor autora = context.newObject (Autor.klasa); author.setName ("Paul"); Članak u članku = context.newObject (Article.class); article.setTitle ("Naslov mog posta"); article.setContent ("Sadržaj"); article.setAuthor (autor); context.commitChanges (); Autor očekujeAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Smith")) .selectOne (context); Članak očekujeArticle = (očekuje seAuthor.getArticles ()). Get (0); assertEquals (article.getTitle (), očekujeArticle.getTitle ()); }

5.6. Brisanje objekta

Brisanje spremljenog objekta u potpunosti ga uklanja iz baze podataka, a zatim ćemo vidjeti null kao rezultat upita:

@Test public void whenDeleting_thenWeLostHisDetails () {Autor autor = context.newObject (Autor.klasa); author.setName ("Paul"); context.commitChanges (); Autor je spasioAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (context); if (savedAuthor! = null) {context.deleteObjects (autor); context.commitChanges (); } Autor očekujeAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (context); assertNull (očekuje seAutor); }

5.7. Izbriši sve zapise klase

Također je moguće ispustiti sve zapise tablice pomoćuSQLTemplate, ovdje to radimo nakon svake ispitne metode kako bismo uvijek imali praznu bazu podataka prije pokretanja svakog testa:

@Nakon javne praznine deleteAllRecords () {SQLTemplate deleteArticles = novi SQLTemplate (Article.class, "delete from article"); SQLTemplate deleteAuthors = novi SQLTemplate (Autor.class, "izbriši od autora"); context.performGenericQuery (deleteArticles); context.performGenericQuery (deleteAuthors); }

6. Zaključak

U ovom smo se vodiču usredotočili na korištenje Apache Cayenne ORM-a za lako pokazivanje CRUD operacija s jedan prema mnogima odnos.

Kao i uvijek, izvorni kod za ovaj članak možete pronaći na GitHubu.


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