Bevezetés az Apache Cayenne ORM-be

1. Áttekintés

Az Apache Cayenne egy nyílt forráskódú könyvtár, amelyet az Apache licenc alatt terjesztenek, és olyan szolgáltatásokat nyújt, mint egy modellező eszköz, objektum-relációs leképezés, más néven ORM a helyi perzisztencia műveletekhez és távoli szolgáltatásokhoz.

A következő szakaszokban megtudhatjuk, hogyan lehet interakcióba lépni egy MySQL adatbázissal az Apache Cayenne ORM használatával.

2. Maven-függőségek

Először csak a következő függőségeket kell hozzáadnunk, hogy együtt hozzuk létre az Apache Cayenne és a MySQL csatlakozót a JDBC illesztőprogramból, hogy hozzáférjünk intro_cayenne adatbázis:

 org.apache.cayenne cayenne-server 4.0.M5 mysql mysql-connector-java 5.1.44 futásidejű 

Konfiguráljuk a Cayenne modellező plugint, amelyet az adatbázis-séma és a Java-objektum közötti hídként szolgáló térképfájlunk megtervezéséhez vagy beállításához használunk:

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

Ahelyett, hogy kézzel készítenénk az XML leképező fájlt (ritkán készül), ajánlott a modellezőt használni, amely egy elég fejlett eszköz, amely a Cayenne disztribúcióval érkezik.

Az operációs rendszertől függően letölthető ebből az archívumból, vagy egyszerűen használja a fentieken belüli Maven pluginként szereplő cross-platform verziót (JAR).

A Maven Central adattár az Apache Cayenne, az ő modellezője és a MySQL Connector legújabb verzióit tárolja.

Ezután építsük fel a projektünket a mvn install és indítsa el a modellező GUI-t a paranccsal mvn cayenne-modellező: fuss a képernyő kimenetének megszerzéséhez:

3. Beállítás

Ahhoz, hogy Apache Cayenne megkeresje a helyes helyi adatbázist, csak ki kell töltenünk a konfigurációs fájlját a fájl megfelelő illesztőprogramjával, URL-jével és egy felhasználójával. cayenne-project.xml található a erőforrások Könyvtár:

Itt láthatjuk, hogy:

  • A helyi adatbázis neve intro_cayenne
  • Ha még nem jött létre, akkor Cayenne megteszi helyettünk
  • A felhasználónevet használjuk gyökér és jelszóval gyökér (módosítsa az adatbázis-kezelő rendszerben regisztrált felhasználóknak megfelelően)

Belsőleg ez a XMLPoolingDataSourceFactory felelős a JDBC kapcsolati információk betöltéséért a DataNodeDescriptor.

Ne feledje, hogy ezek a paraméterek az adatbázis-kezelő rendszerhez és a JDBC illesztőprogramhoz viszonyulnak, mert ez a könyvtár sok különböző adatbázist támogat.

Mindegyikük rendelkezik adapterrel, amely ebben a részletes listában elérhető. Vegye figyelembe, hogy a 4.0 verzió teljes dokumentációja még nem áll rendelkezésre, ezért itt hivatkozunk az előző verzióra.

4. Térképezés és adatbázis tervezés

4.1. Modellezés

Most kattintsunk a gombra „Nyitott projekt”, keresse meg a projekt erőforrás mappáját, és válassza a fájlt cayenne-project.xml, a modellező ezt megmutatja:

Itt, választhatunk, hogy létrehozzuk a leképezési struktúránkat egy meglévő adatbázisbólvagy manuálisan folytassa. Ez a cikk a modellezőt és a meglévő adatbázist használja, hogy bejuthasson Cayenne-be, és gyorsan tudja, hogyan működik.

Vessünk egy pillantást a mi intro_cayenne adatbázis, amelynek van egy egy a sokhoz kapcsolat két táblázat között, mivel a szerző sok cikket publikálhat vagy birtokolhat:

  • szerző: id (PK) és név
  • cikk: id (PK), cím, tartalom, és szerző_azonosító (FK)

Most menjünk aEszközök> Reengineer adatbázis séma“, És minden hozzárendelési konfigurációnk automatikusan kitöltődik. A prompt képernyőn csak töltse ki az adatforrás-konfigurációt, amely ott fent található a cayenne-project.xml fájl és nyomja meg a Folytatás gombot:

A következő képernyőn ellenőriznünk kell a „Java primitív típusok használata” elemet az alábbiak szerint:

Biztosítanunk kell a betétet is com.baeldung.apachecayenne.persistent Java csomagként, és mentse el; látni fogjuk, hogy az XML konfigurációs fájl frissült defaultPackage tulajdonság, hogy megfeleljen a Java csomagnak:

Az összesben ObjEntity meg kell adnunk az alosztályok csomagját a következő képen látható módon, és kattintson a gombra "mentés" ikon ismét:

Mostantól „Eszközök> Osztályok létrehozása” menüben válassza aNormál perzisztens objektumok”Típusként; és a „Osztályok” lapon ellenőrizze az összes osztályt és nyomja meg "generál".

Térjünk vissza a forráskódra, és nézzük meg, hogy a perzisztens objektumaink sikeresen lettek-e létrehozva, erről szólva _Article.java és _Author.java.

Ne feledje, hogy ezek a konfigurációk el vannak mentve a fájlban datamap.map.xml szintén a erőforrások mappába.

4.2. Térképszerkezet

A létrehozott XML leképezési fájl az erőforrás mappában néhány egyedi címkét használ az Apache Cayenne-hez képest:

  • DataNode () - az adatbázis modellje, annak tartalma, az adatbázishoz való kapcsolódáshoz szükséges összes információ (az adatbázis neve, az illesztőprogram és a felhasználói hitelesítő adatok)
  • DataMap () - ez egy tartós entitás tárolója a kapcsolataikkal
  • DbAttribute () - egy oszlopot képvisel az adatbázis-táblában
  • DbEntity () - egyetlen adatbázistábla vagy nézet modellje, DbAttribútumokkal és kapcsolatokkal rendelkezhet
  • ObjEntity () - egyetlen tartós java osztály modellje; objektumattribútumokból készül, amelyek megfelelnek az entitásosztály tulajdonságainak és az ObjRelationship tulajdonságoknak, amelyek olyan tulajdonságok, amelyek egy másik entitás típusával rendelkeznek
  • Beágyazható () - egy Java osztály modellje, amely egy ObjEntity tulajdonságaként működik, de megfelel az adatbázis több oszlopának
  • Eljárás () - tárolt eljárás regisztrálása az adatbázisban
  • Lekérdezés() - egy lekérdezés modellje, amelyet a lekérdezés leképezésére használnak a konfigurációs fájlban, elfelejtve, hogy a kódban is meg tudjuk csinálni

Itt vannak a teljes részletek.

5. Cayenne API

Az egyetlen hátralévő lépés az, hogy a Cayenne API-t használjuk adatbázis-műveleteink végrehajtására generált osztályok felhasználásával, tudván, hogy a tartós osztályaink alosztályozása csak egy legjobb gyakorlat a modell későbbi testreszabására.

5.1. Objektum létrehozása

Itt csak mentünk egy Szerző objektumot, és később ellenőrizze, hogy csak egy ilyen típusú rekord van-e az adatbázisban:

@Test public void whenInsert_thenWeGetOneRecordInTheDatabase () {Author author = context.newObject (Author.class); author.setName ("Paul"); context.commitChanges (); hosszú rekordok = ObjectSelect.dataRowQuery (Szerző.osztály) .selectCount (kontextus); assertEquals (1, rekordok); }

5.2. Objektum olvasása

Miután mentett egy Szerző, csak egy adott tulajdonság egyszerű lekérdezésével választjuk ki:

@Test public void whenInsert_andQueryByFirstName_thenWeGetTheAuthor () {Author author = context.newObject (Author.class); author.setName ("Paul"); context.commitChanges (); Szerző VárhatóAuthor = ObjectSelect.query (Szerző.osztály) .hol (SzerzőNÉV.eq ("Paul")) .selectOne (kontextus); assertEquals ("Paul", várhatóAuthor.getName ()); }

5.3. Az osztály összes rekordjának lekérése

Menteni fogunk két szerzőt, és visszakeresünk egy szerzőobjektum-gyűjteményt annak ellenőrzésére, hogy csak ez a két mentett-e:

@Test public void whenInsert_andQueryAll_thenWeGetTwoAuthors () {Author FirstAuthor = context.newObject (Author.class); firstAuthor.setName ("Paul"); Szerző secondAuthor = context.newObject (Szerző.osztály); secondAuthor.setName ("Ludovic"); context.commitChanges (); Szerzők listája = ObjectSelect .query (Author.class) .select (context); assertEquals (2, szerzők.méret ()); }

5.4. Objektum frissítése

A frissítési folyamat is egyszerű, de először meg kell szereznünk a kívánt objektumot, mielőtt módosítanánk a tulajdonságait és alkalmaznánk az adatbázisra:

@Test public void whenUpdating_thenWeGetAnUpatedeAuthor () {Author author = context.newObject (Author.class); author.setName ("Paul"); context.commitChanges (); Szerző VárhatóAuthor = ObjectSelect.query (Szerző.osztály) .hol (SzerzőNÉV.eq ("Paul")) .selectOne (kontextus); VárhatóAuthor.setName ("Garcia"); context.commitChanges (); assertEquals (author.getName (), várhatóAuthor.getName ()); }

5.5. Objektum csatolása

Hozzárendelhetünk egy cikket egy szerzőhöz:

@Test public void whenAttachingToArticle_thenTheRelationIsMade () {Author author = context.newObject (Author.class); author.setName ("Paul"); Cikk cikk = context.newObject (cikk.osztály); article.setTitle ("Saját bejegyzés címe"); article.setContent ("A tartalom"); article.setAuthor (szerző); context.commitChanges (); Szerző VárhatóAuthor = ObjectSelect.query (Szerző.osztály) .hol (SzerzőNÉV.eq ("Smith")) .selectOne (kontextus); Cikk várhatóArticle = (várhatóAuthor.getArticles ()). Get (0); assertEquals (cikk.getTitle (), várhatóArticle.getTitle ()); }

5.6. Objektum törlése

A mentett objektum törlése teljesen eltávolítja az adatbázisból, majd meglátjuk nulla a lekérdezés eredményeként:

@Test public void whenDeleting_thenWeLostHisDetails () {Author author = context.newObject (Author.class); author.setName ("Paul"); context.commitChanges (); Szerző savedAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (kontextus); if (savedAuthor! = null) {context.deleteObjects (szerző); context.commitChanges (); } Szerző várhatóAuthor = ObjectSelect.query (Author.class) .where (Author.NAME.eq ("Paul")) .selectOne (kontextus); assertNull (várható jogosult); }

5.7. Törölje az osztály összes rekordját

Az is lehetséges, hogy egy tábla összes rekordját eldobja aSQLTemplate, itt minden tesztmódszer után ezt tesszük, hogy mindig legyen érvénytelen adatbázis minden teszt elindítása előtt:

@A nyilvános void deleteAllRecords () után {SQLTemplate deleteArticles = new SQLTemplate (Article.class, "delete from Article"); SQLTemplate deleteAuthors = új SQLTemplate (Szerző.osztály, "törlés a szerzőből"); context.performGenericQuery (deleteArticles); context.performGenericQuery (deleteAuthors); }

6. Következtetés

Ebben az oktatóanyagban az Apache Cayenne ORM használatára összpontosítottunk, hogy könnyen bemutassuk, hogyan lehet CRUD műveleteket végrehajtani a egy a sokhoz kapcsolat.

Mint mindig, a cikk forráskódja a GitHub oldalon található.