Vodič za hibernaciju OGM

1. Pregled

U ovom uputstvu proći ćemo kroz osnove hibernacije Map / Grid Mapper (OGM).

Hibernate OGM pruža podršku za Java Persistent API (JPA) za NoSQL skladišta podataka. NoSQL je krovni pojam koji pokriva širok spektar pohrane podataka. Na primjer, to uključuje skladišta podataka ključ / vrijednost, dokument, stupce i grafove.

2. Arhitektura hibernacije OGM

Hibernate tradicionalno nudi objektno relacijsko mapiranje (ORM) za relacijske baze podataka. Hibernate OGM engine proširuje svoju funkcionalnost na podršku NoSQL pohranama podataka. Primarna prednost njegove upotrebe je dosljednost JPA sučelja u relacijskim i NoSQL pohranama podataka.

Hibernate OGM je u mogućnosti pružiti apstrakciju na većem broju NoSQL spremišta podataka zbog dva ključna sučelja, DatastoreProvider i GridDialect. Stoga svaka nova NoSQL baza podataka koju podržava dolazi s implementacijom tih sučelja.

Od danas ne podržava sve NoSQL pohrane podataka, ali sposoban je za rad s mnogima od njih poput Infinispana i Ehcachea (ključ-vrijednost), MongoDB-a i CouchDB-a (dokument) i Neo4j (graf).

Također u potpunosti podržava transakcije i može raditi sa standardnim JTA dobavljačima. Prvo, to se može pružiti putem spremnika EE Jakarte bez ikakve izričite konfiguracije. Štoviše, u Java SE okruženju možemo koristiti samostalni upravitelj transakcija JTA poput Narayane.

3. Postavljanje

Za ovaj ćemo vodič koristiti Maven za povlačenje potrebnih ovisnosti za rad s Hibernate OGM-om. Također ćemo koristiti MongoDB.

Da pojasnimo, pogledajmo kako ih postaviti za tutorial.

3.1. Ovisnosti Mavena

Pogledajmo ovisnosti potrebne za rad s Hibernate OGM i MongoDB:

 org.hibernate.ogm hibernate-ogm-mongodb 5.4.0.Final org.jboss.narayana.jta narayana-jta 5.9.2.Final 

Ovdje povlačimo potrebne ovisnosti kroz Maven:

  • Hibernate OGM dijalekt za MongoDB
  • Narayana Transaction Manager (stvarni pružatelj JTA-e)

3.2. Jedinica postojanosti

Morat ćemo i mi definirati detalje o skladištu podataka u hibernaciji postojanost.xml:

 org.hibernate.ogm.jpa.HibernateOgmPersistence 

Obratite pažnju na definicije koje smo ovdje dali:

  • vrijednost tipa atributa transakcije kao “JTA” (to podrazumijeva da želimo upravitelja entiteta JTA od EntityManagerFactory)
  • davatelja usluga, koji je HibernateOgmPersistence za Hibernate OGM
  • nekoliko dodatnih detalja povezanih s DB-om (oni se obično razlikuju između različitih izvora podataka)

Konfiguracija pretpostavlja da je MongoDB pokrenut i dostupan prema zadanim postavkama. Ako to nije slučaj, uvijek možemo pružiti detalje po potrebi. Jedan od naših prethodnih članaka također detaljno pokriva postavljanje MongoDB-a.

4. Definicija entiteta

Sad kad smo prošli kroz osnove, definirajmo neke cjeline. Ako smo prije radili s Hibernate ORM ili JPA, ovo više nema što dodati. To je temeljna premisa hibernacije OGM. To obećava da će nam dopustiti rad s različitim NoSQL datotekama samo uz znanje JPA.

Za ovaj tutorial definirat ćemo jednostavan objektni model:

Ona definira Članak, Autor i Urednik klase zajedno sa svojim vezama.

Definirajmo ih i na Javi:

@Entity javna klasa Article {@Id @GeneratedValue (generator = "uuid") @GenericGenerator (name = "uuid", strategy = "uuid2") private String articleId; private String articleTitle; @ManyToOne privatni autor autor; // konstruktori, getteri i postavljači ...}
@Entity javni razred Autor {@Id @GeneratedValue (generator = "uuid") @GenericGenerator (name = "uuid", strategy = "uuid2") private String authorId; private String authorName; @ManyToOne privatni urednik uređivača; @OneToMany (mappedBy = "author", cascade = CascadeType.PERSIST) private Set authoredArticles = new HashSet (); // konstruktori, getteri i postavljači ...}
@Entity urednik javne klase {@Id @GeneratedValue (generator = "uuid") @GenericGenerator (name = "uuid", strategy = "uuid2") private String editorId; private String editorName; @OneToMany (mappedBy = "editor", cascade = CascadeType.PERSIST) private Set assignAuthors = new HashSet (); // konstruktori, getteri i postavljači ...}

Sada smo definirali klase entiteta i označili ih JPA standardnim bilješkama:

  • @ Entitet da ih uspostave kao JPA entitete
  • @Iskaznica za generiranje primarnih ključeva za entitete s UUID-ovima
  • @OneToMany i @ManyToOne uspostaviti dvosmjerne odnose između entiteta

5. Operacije

Sad kad smo stvorili svoje entitete, da vidimo možemo li izvršiti neke operacije nad njima. Kao prvi korak morat ćemo generirati neke testne podatke. Ovdje ćemo stvoriti Urednik, nekoliko Autor, i još Članak. Također ćemo uspostaviti njihove veze.

Nakon toga, prije nego što možemo izvršiti bilo koju operaciju, trebat će nam instanca EntityManagerFactory. Ovo možemo koristiti za stvaranje EntityManager. Uz ovo, trebamo stvarati TransactionManager za rukovanje granicama transakcija.

Pogledajmo kako ih možemo koristiti da ustrajemo i dohvatimo entitete koje smo ranije stvorili:

private void persistTestData (EntityManagerFactory entityManagerFactory, Editor editor) baca izuzetak {TransactionManageractionManager = com.arjuna.ats.jta.TransactionManager.transactionManager (); actionManager.begin (); EntityManager entityManager = entityManagerFactory.createEntityManager (); entityManager.persist (urednik); entityManager.close (); actionManager.commit (); }

Evo, koristimo EntityManager ustrajati u korijenskom entitetu koji kaskadira sve svoje odnose. Ovu operaciju također izvodimo u definiranim granicama transakcije.

Sada smo spremni učitati entitet koji smo upravo ustrajali i provjeriti njegov sadržaj. Možemo pokrenuti test da bismo to provjerili:

@Test javna praznina givenMongoDB_WhenEntitiesCreated_thenCanBeRetrieved () baca izuzetak {EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory ("ogm-mongodb"); Uređivač uređivača = generirajTestData (); persistTestData (entityManagerFactory, urednik); TransactionManageractionManager = com.arjuna.ats.jta.TransactionManager.transactionManager (); actionManager.begin (); EntityManager entityManager = entityManagerFactory.createEntityManager (); Uređivač loadedEditor = entityManager.find (Editor.class, editor.getEditorId ()); assertThat (loadedEditor) .isNotNull (); // Ostale tvrdnje za provjeru entiteta i odnosa}

Ovdje koristimo EntityManager ponovno pronaći podatke i na njima izvesti standardne tvrdnje. Kada pokrenemo ovaj test, on pokreće trgovinu podataka, nastavlja entitete, vraća ih natrag i provjerava.

Opet jesmo upravo je koristio JPA da ustraje u entitetima zajedno s njihovim odnosom. Slično tome, koristimo JPA za ponovno učitavanje entiteta i sve to dobro funkcionira, čak i kada je naš izbor baze podataka MongoDB umjesto tradicionalne relacijske baze podataka.

6. Promjena Backenda

Također možemo prebaciti naš backkend. Otkrijmo sada koliko će biti teško to učiniti.

Promijenit ćemo našu pozadinu u Neo4j, koja je popularna trgovina podataka orijentirana na grafove.

Prvo, dodajmo ovisnost Mavena za Neo4j:

 org.hibernate.ogm hibernate-ogm-neo4j 5.4.0.Finalni 

Dalje, u našu ćemo morati dodati odgovarajuću jedinicu postojanosti postojanost.xml:

 org.hibernate.ogm.jpa.HibernateOgmPersistence 

Ukratko, ovo su vrlo osnovne konfiguracije potrebne za Neo4j. To se može detaljno detaljno opisati prema potrebi.

Pa, to je uglavnom ono što treba učiniti. Kada pokrenemo isti test s Neo4j kao i pozadinska trgovina podataka, to funkcionira prilično neprimjetno.

Imajte na umu da smo našu pozadinu prebacili s MongoDB-a, koji je, čini se, skladište podataka usmjereno na dokumente, na Neo4j, koji je skladište podataka orijentirano na grafove. I sve smo to učinili s minimalnim promjenama i bez potrebe za bilo kakvim promjenama u bilo kojem od naših operacija.

7. Zaključak

U ovom smo članku prošli kroz osnove Hibernate OGM-a, uključujući njegovu arhitekturu. Nakon toga smo implementirali osnovni model domene i izvodili razne operacije koristeći razne DB-ove.

Kao i uvijek, kod za primjere dostupan je na GitHub-u.


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