Sprievodca po režime dlhodobého spánku

1. Prehľad

V tomto výučbe sa oboznámime so základmi Hibernate Object / Grid Mapper (OGM).

Hibernate OGM poskytuje podporu Java Persistence API (JPA) pre dátové úložiská NoSQL. NoSQL je zastrešujúci pojem pokrývajúci širokú škálu dátových úložísk. Patria sem napríklad úložiská údajov typu kľúč - hodnota, dokument, stĺpec a graf.

2. Architektúra režimu dlhodobého spánku OGM

Hibernate tradične ponúka pre relačné databázy engine Object Relational Mapping (ORM). Hibernate OGM engine rozširuje svoju funkcionalitu o podporu NoSQL dátových úložísk. Primárnou výhodou jeho použitia je konzistencia rozhrania JPA naprieč relačnými a NoSQL dátovými úložiskami.

Hibernácia OGM je schopná poskytnúť abstrakciu v niekoľkých úložiskách NoSQL vďaka dvom kľúčovým rozhraniam, Poskytovateľ údajov a GridDialect. Preto každé nové úložisko NoSQL, ktoré podporuje, prichádza s implementáciou týchto rozhraní.

Od dnešného dňa nepodporuje všetky dátové úložiská NoSQL, ale je schopný pracovať s mnohými z nich, ako sú Infinispan a Ehcache (kľúč - hodnota), MongoDB a CouchDB (dokument) a Neo4j (graf).

Tiež plne podporuje transakcie a môže pracovať so štandardnými poskytovateľmi JTA. Najskôr to možno poskytnúť prostredníctvom kontajnera Jakarta EE bez akejkoľvek výslovnej konfigurácie. V prostredí Java SE môžeme navyše použiť samostatného manažéra transakcií JTA, ako je Narayana.

3. Inštalácia

Pre tento tutoriál použijeme program Maven na získanie požadovaných závislostí na prácu s Hibernate OGM. Použijeme aj MongoDB.

Aby sme si to objasnili, pozrime sa, ako ich nastaviť pre výukový program.

3.1. Maven závislosti

Pozrime sa na závislosti vyžadované pre prácu s Hibernate OGM a MongoDB:

 org.hibernate.ogm hibernate-ogm-mongodb 5.4.0. Záverečné org.jboss.narayana.jta narayana-jta 5.9.2. 

Tu sťahujeme požadované závislosti cez Maven:

  • Hibernate OGM dialect for MongoDB
  • Narayana Transaction Manager (skutočný poskytovateľ JTA)

3.2. Jednotka perzistencie

Budeme tiež musieť definovať podrobnosti úložiska údajov v režime dlhodobého spánku persistance.xml:

 org.hibernate.ogm.jpa.HibernateOgmPersistence 

Všimnite si definície, ktoré sme tu poskytli:

  • hodnota atribútu typ transakcie ako „JTA“ (to znamená, že od manažéra entity JTA chceme mať EntityManagerFactory)
  • poskytovateľ, ktorým je HibernateOgmPersistence pre režim dlhodobého spánku OGM
  • niekoľko ďalších podrobností týkajúcich sa DB (zvyčajne sa líšia medzi rôznymi zdrojmi údajov)

Konfigurácia predpokladá, že MongoDB je spustený a je prístupný pri predvolených nastaveniach. Ak to tak nie je, môžeme kedykoľvek poskytnúť potrebné podrobnosti. Jeden z našich predchádzajúcich článkov sa venuje podrobnému nastaveniu MongoDB.

4. Definícia entity

Teraz, keď sme prešli základmi, definujme niektoré entity. Ak sme predtým spolupracovali s programom Hibernate ORM alebo JPA, nie je potrebné k tomu už nič dodať. Toto je základný predpoklad režimu dlhodobého spánku. To sľubuje, že nám umožní pracovať s rôznymi databázami NoSQL iba so znalosťou JPA.

Pre tento tutoriál definujeme jednoduchý objektový model:

Definuje to Článok, Autor a Editor triedy spolu s ich vzťahmi.

Definujme ich tiež v Jave:

@Entity public class Article {@Id @GeneratedValue (generator = "uuid") @GenericGenerator (name = "uuid", strategy = "uuid2") private String articleId; private String articleTitle; @ManyToOne súkromný autor autor; // konštruktéri, zakladatelia a zakladatelia ...}
@Entity verejná trieda Autor {@Id @GeneratedValue (generator = "uuid") @GenericGenerator (name = "uuid", strategy = "uuid2") private String authorId; private String authorName; @ManyToOne editor súkromného editora; @OneToMany (mappedBy = "autor", cascade = CascadeType.PERSIST) súkromná sada authoredArticles = new HashSet (); // konštruktory, zakladatelia a zakladatelia ...}
@Entity editor verejnej triedy {@Id @GeneratedValue (generátor = "uuid") @GenericGenerator (name = "uuid", strategy = "uuid2") súkromný reťazec editorId; private String editorName; @OneToMany (mappedBy = "editor", cascade = CascadeType.PERSIST) súkromná množina priradenáAuthors = nová HashSet (); // konštruktory, zakladatelia a zakladatelia ...}

Teraz sme definovali triedy entít a anotovali ich štandardnými anotáciami JPA:

  • @Entity založiť ich ako subjekty spoločného parlamentného zhromaždenia
  • @Id na generovanie primárnych kľúčov pre entity s UUID
  • @OneToMany a @ManyToOne nadviazať obojsmerné vzťahy medzi entitami

5. Operácie

Teraz, keď sme vytvorili naše entity, sa pozrime, či s nimi môžeme vykonať nejaké operácie. Ako prvý krok budeme musieť vygenerovať niektoré testovacie údaje. Tu vytvoríme Editor, zopár Autor, a nejaké Článok. Nadviažeme tiež ich vzťahy.

Potom, ako budeme môcť vykonať akúkoľvek operáciu, budeme potrebovať inštanciu EntityManagerFactory. To môžeme použiť na vytvorenie EntityManager. Spolu s tým musíme vytvárať TransactionManager na spracovanie hraníc transakcií.

Pozrime sa, ako ich môžeme použiť na pretrvávanie a načítanie entít, ktoré sme vytvorili skôr:

private void persistTestData (EntityManagerFactory entityManagerFactory, editor editora) vyvolá výnimku {TransactionManager transactionManager = com.arjuna.ats.jta.TransactionManager.transactionManager (); transactionManager.begin (); EntityManager entityManager = entityManagerFactory.createEntityManager (); entityManager.persist (editor); entityManager.close (); actionManager.commit (); }

Tu používame EntityManager pretrvávať koreňovú entitu, ktorá kaskáduje všetky svoje vzťahy. Túto operáciu tiež vykonávame v rámci vymedzenej hranice transakcie.

Teraz sme pripravení načítať entitu, ktorú sme práve udržali, a overiť jej obsah. Môžeme spustiť test na overenie tohto:

@Test public void givenMongoDB_WhenEntitiesCreated_thenCanBeRetrieved () vyvolá výnimku {EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory ("ogm-mongodb"); Editor editor = generateTestData (); persistTestData (entityManagerFactory, editor); TransactionManager transactionManager = com.arjuna.ats.jta.TransactionManager.transactionManager (); transactionManager.begin (); EntityManager entityManager = entityManagerFactory.createEntityManager (); Editor loadedEditor = entityManager.find (Editor.class, editor.getEditorId ()); assertThat (loadedEditor) .isNotNull (); // Ďalšie tvrdenia na overenie entít a vzťahov}

Tu používame EntityManager znova vyhľadať údaje a vykonať na nich štandardné tvrdenia. Keď spustíme tento test, vytvorí sa z neho inštancia dátového skladu, pretrváva entity, získava sa späť a overuje sa.

Opäť sme práve použil JPA na pretrvávanie entít spolu s ich vzťahom. Podobne používame JPA na načítanie entít späť a všetko funguje dobre, aj keď je našou voľbou databázy MongoDB namiesto tradičnej relačnej databázy.

6. Prepínanie backendu

Môžeme tiež prepnúť svoj backend. Poďme teraz zistiť, aké ťažké to bude robiť.

Náš backend zmeníme na Neo4j, čo je populárne graficky orientované dátové úložisko.

Najskôr pridajme závislosť Maven pre Neo4j:

 org.hibernate.ogm hibernate-ogm-neo4j 5.4.0.Final 

Ďalej budeme musieť do nášho súboru pridať príslušnú jednotku perzistencie persistence.xml:

 org.hibernate.ogm.jpa.HibernateOgmPersistence 

Stručne povedané, jedná sa o veľmi základné konfigurácie požadované pre Neo4j. Toto je možné podľa potreby podrobnejšie rozpísať.

No, to je vlastne dosť, čo treba urobiť. Keď spustíme rovnaký test s Neo4j ako back-endové dátové úložisko, funguje to celkom bez problémov.

Všimnite si, že sme presunuli náš backend z MongoDB, ktoré sa stalo dokumentovo orientovaným dátovým úložiskom, na Neo4j, čo je graficky orientované dátové úložisko. A to všetko sme robili s minimálnymi zmenami a bez potreby akýchkoľvek zmien v ktorejkoľvek z našich prevádzok.

7. Záver

V tomto článku sme si prešli základy Hibernate OGM vrátane jeho architektúry. Následne sme implementovali základný doménový model a vykonávali rôzne operácie pomocou rôznych DB.

Ako vždy, kód príkladov je k dispozícii na GitHub.