Úvod do Apache Cayenne ORM

1. Prehľad

Apache Cayenne je knižnica s otvoreným zdrojovým kódom distribuovaná pod licenciou Apache, ktorá poskytuje funkcie ako nástroj na modelovanie, objektovo-relačné mapovanie aka ORM pre miestne operácie pretrvávania a služby vzdialenej komunikácie.

V nasledujúcich častiach sa dozvieme, ako interagovať s databázou MySQL pomocou servera Apache Cayenne ORM.

2. Maven závislosti

Ak chcete začať, stačí pridať nasledujúce závislosti, aby sme priniesli konektor Apache Cayenne a MySQL spolu s ovládačom JDBC na prístup k našim intro_cayenne databáza:

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

Poďme nakonfigurovať doplnok Cayenne modelár, ktorý sa použije na návrh alebo nastavenie nášho mapovacieho súboru, ktorý slúži ako most medzi databázovou schémou a objektom Java:

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

Namiesto ručného vytvárania mapovacieho súboru XML (zriedka) sa odporúča používať modelár, čo je dosť pokročilý nástroj dodávaný s distribúciou Cayenne.

Je k dispozícii na stiahnutie z tohto archívu v závislosti od operačného systému, alebo stačí použiť cross-platformovú verziu (JAR) zahrnutú ako doplnok Maven hore.

Repozitár Maven Central hostí najnovšie verzie Apache Cayenne, jeho modelára, a MySQL Connector.

Ďalej postavme náš projekt pomocou inštalácia mvn a príkazom spustíme grafické rozhranie modelára mvn cayenne-modeler: spustiť ako výstup získate túto obrazovku:

3. Inštalácia

Aby Apache Cayenne vyhľadal správnu lokálnu databázu, stačí, aby sme jeho konfiguračný súbor vyplnili správnym ovládačom, adresou URL a používateľom v súbore. cayenne-project.xml nachádza sa v zdrojov adresár:

Tu vidíme, že:

  • Lokálna databáza je pomenovaná intro_cayenne
  • Ak to ešte nie je vytvorené, urobí to za nás Cayenne
  • Pripojíme sa pomocou používateľského mena koreň a heslo koreň (zmeňte to podľa používateľov zaregistrovaných vo vašom systéme na správu databáz)

Vnútorne je to XMLPoolingDataSourceFactory zodpovedný za načítanie informácií o pripojení JDBC z prostriedku XML priradeného k DataNodeDescriptor.

Uvedomte si, že tieto parametre sú relatívne k systému správy databáz a ovládaču JDBC, pretože táto knižnica podporuje mnoho rôznych databáz.

Každá z nich má v tomto podrobnom zozname k dispozícii adaptér. Upozorňujeme, že úplná dokumentácia pre verziu 4.0 ešte nie je k dispozícii, preto si pozrite predchádzajúcu verziu tu.

4. Mapovanie a návrh databázy

4.1. Modelovanie

Teraz kliknime na ikonu „Otvorený projekt“, prejdite do priečinka zdrojov projektu a vyberte súbor cayenne-project.xml, modelár to ukáže:

Tu, máme na výber, či vytvoríme našu mapovaciu štruktúru z existujúcej databázyalebo postupovať ručne. Tento článok sa bude zaoberať tým, ktorý využíva modelár a existujúcu databázu, aby sa dostal do Cayenne a rýchlo vedel, ako to funguje.

Poďme sa pozrieť na naše intro_cayenne databáza, ktorá má a jedna k mnohým vzťah medzi dvoma tabuľkami, pretože autor môže publikovať alebo vlastniť veľa článkov:

  • autor: id (PK) a názov
  • článok: id (PK), názov, obsaha author_id (FK)

Teraz poďme k „Nástroje> Schéma databázy reengineera“, A všetky naše konfigurácie mapovania budeme mať vyplnené automaticky. Na obrazovke s výzvou stačí vyplniť konfiguráciu zdroja údajov, ktorá je k dispozícii tam v priečinku cayenne-project.xml súbor a stlačte pokračovať:

Na ďalšej obrazovke musíme nasledovne skontrolovať možnosť „Použiť primitívne typy Java“:

Musíme tiež zabezpečiť, aby com.baeldung.apachecayenne.perzistentné ako balík Java a uložte ho; uvidíme, že bol aktualizovaný konfiguračný súbor XML defaultPackage vlastnosť zodpovedajúca balíku Java:

V každom Objektívnosť musíme určiť balík pre podtriedy, ako je znázornené na nasledujúcom obrázku, a kliknúť na ikonu „Uložiť“ znova ikona:

Teraz „Nástroje> Generovať triedy“ menu, zvoľte „Štandardné trvalé objekty”Ako typ; a na „Triedy“ karta skontrolujte všetky triedy a stlačte „Generovať“.

Vráťme sa k zdrojovému kódu a zistíme, že naše perzistentné objekty boli úspešne vygenerované _Article.java a _Author.java.

Upozorňujeme, že všetky tieto konfigurácie sú uložené v súbore datamap.map.xml tiež sa nachádza v zdrojov priečinok.

4.2. Štruktúra mapovania

Vygenerovaný súbor mapovania XML, ktorý sa nachádza v priečinku prostriedkov, používa niektoré jedinečné značky súvisiace s Apache Cayenne:

  • DataNode () - model databázy, jej obsah, všetky informácie potrebné na pripojenie k databáze (názov databázy, údaje o vodičovi a používateľovi)
  • DataMap () - je to kontajner pretrvávajúcich entít s ich vzťahmi
  • DbAttribute () - predstavuje stĺpec v databázovej tabuľke
  • DbEntity () - model jednej databázovej tabuľky alebo zobrazenia, môže mať DbAttributes a vzťahy
  • ObjEntity () - model jednej pretrvávajúcej triedy Java; vyrobené z ObjAttributes, ktoré zodpovedajú vlastnostiam triedy entít a ObjRelationships, čo sú vlastnosti, ktoré majú typ inej entity
  • Možnosť vloženia () - model triedy Java, ktorá funguje ako vlastnosť ObjEntity, ale zodpovedá viacerým stĺpcom v databáze
  • Postup () - zaregistrovať uloženú procedúru v databáze
  • Dopyt() - model dotazu, ktorý sa používa na mapovanie dotazu v konfiguračnom súbore bez toho, aby sme nezabudli, že to môžeme urobiť aj v kóde

Tu sú všetky podrobnosti.

5. API Cayenne

Jediným zostávajúcim krokom je použitie Cayenne API na vykonávanie našich databázových operácií pomocou vygenerovaných tried s vedomím, že podtrieda našich pretrvávajúcich tried je iba osvedčeným postupom, ktorý sa neskôr použije na prispôsobenie modelu.

5.1. Vytvorenie objektu

Tu len uložíme Autor objekt a neskôr skontrolujte, či je v databáze iba jeden záznam tohto typu:

@Test public void whenInsert_thenWeGetOneRecordInTheDatabase () {Author author = context.newObject (Author.class); author.setName ("Paul"); context.commitChanges (); dlhé záznamy = ObjectSelect.dataRowQuery (Author.class) .selectCount (kontext); assertEquals (1, záznamy); }

5.2. Čítanie objektu

Po uložení Autor, iba ho vyberieme okrem iného prostredníctvom jednoduchého dotazu konkrétnej vlastnosti:

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

5.3. Získanie všetkých záznamov triedy

Uložíme dvoch autorov a stiahneme kolekciu autorských objektov, aby sme skontrolovali, či sú uložení iba títo dvaja:

@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 (); Zoznam autorov = ObjectSelect .query (Author.class) .select (kontext); assertEquals (2, autorov.size ()); }

5.4. Aktualizácia objektu

Proces aktualizácie je tiež jednoduchý, ale pred úpravou jeho vlastností a jeho použitím v databáze musíme najskôr mať požadovaný objekt:

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

5.5. Pripojenie objektu

Článok môžeme priradiť autorovi:

@Test public void whenAttachingToArticle_thenTheRelationIsMade () {Autor autor = context.newObject (Author.class); author.setName ("Paul"); Article article = context.newObject (Article.class); article.setTitle ("Názov môjho príspevku"); article.setContent ("Obsah"); article.setAuthor (autor); context.commitChanges (); Autor expectAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Smith")) .selectOne (kontext); Article expectArticle = (expectAuthor.getArticles ()). Get (0); assertEquals (article.getTitle (), expectArticle.getTitle ()); }

5.6. Vymazanie objektu

Vymazanie uloženého objektu ho úplne odstráni z databázy, potom uvidíme nulový ako výsledok dotazu:

@Test public void whenDeleting_thenWeLostHisDetails () {Author author = context.newObject (Author.class); author.setName ("Paul"); context.commitChanges (); Autor savedAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (kontext); if (savedAuthor! = null) {context.deleteObjects (autor); context.commitChanges (); } Autor expectAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (kontext); assertNull (expectAuthor); }

5.7. Odstrániť všetky záznamy z triedy

Je tiež možné zrušiť všetky záznamy tabuľky pomocouSQLTemplate, tu to robíme po každej testovacej metóde, aby sme pred spustením každého testu mali vždy databázu void:

@After public void deleteAllRecords () {SQLTemplate deleteArticles = new SQLTemplate (Article.class, "delete from article"); SQLTemplate deleteAuthors = nový SQLTemplate (Author.class, "vymazať od autora"); context.performGenericQuery (deleteArticles); context.performGenericQuery (deleteAuthors); }

6. Záver

V tomto tutoriáli sme sa zamerali na použitie Apache Cayenne ORM na ľahké preukázanie toho, ako robiť operácie CRUD pomocou a jedna k mnohým vzťah.

Zdrojový kód tohto článku nájdete ako vždy na serveri GitHub.


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