Object-relational Mapping folosind JPA, Hibernate si Spring Data JPA

In aceasta serie de articole vom compara JPA, Hibernate si Spring Data JPA si vom vedea in ce situatii este bine sa lucram cu fiecare dintre ele.

Object persistence inseamna ca informatia din obiectele dintr-o aplicatie poate sa ramana si dupa ce acea aplicatie a fost executata. Insemnand ca informatia poate sa fie salvata si recuperata. Persistence in Java necesita object-relational mapping. Maparea instantelor obiectului pe tabelele unei baze de date relationale. Exista putine alternative de a face acest object-relational mapping, de la care vom incepe sa analizam, comparam si contrastam Jakarta Persistence API (JPA), Hibernate, si Spring Data JPA. Multe aplicatii necesita date persistente. Daca un sistem informational nu salveaza date atunci cand rularea aplicatiei inceteaza, utilitatea lui este destul de limitata.

Managementul persistent data ar putea sa fie o decizie de design fundamentala in proiectele software. Putem sa folosim doar SQL, proceduri stocate si triggers, sau trebuie sa abordam aceasta problema folosind Java frameworks? Ar trebui sa scriem de unii singuri operatiuni de baza CRUD (create, read, update, delete) in SQL si JDBC, sau ar trebui ca aceste activitati sa fie facute de un layer intermediar? Sistemele de management al bazelor de date relationale au dialecte SQL proprii, astfel ca trebuie sa ne gandim cum vom adresa portabilitatea? [1] ORM (object/relational mapping) este astazi larg raspandit. Acest lucru se datoreaza in mare parte lui Hibernate, un ORM open-source, si Spring Data, un proiect umbrela din cadrul familiei Spring al carui scop este sa unifice si sa faciliteze accesul la diferite tipuri de persistence stores, inclusiv sisteme de baze de date relationale si baze de date NoSQL.

Bazele de date relationale administreaza integritatea datelor. Acest lucru se datoreaza in mare parte fundamentelor stabilite de o lunga perioada de timp legate de modele de date relationale [2][3].
In mod normal, datele sunt necesare si accesate mai mult decat aplicatia care le administreaza [4]. Acest principiu de independenta a datelor va insemna ca aplicatiile care acceseaza datele s-ar putea schimba sau ar putea sa dispara, in timp ce structura logica a datelor ar trebui sa supravietuiasca.

JDBC API este metoda clasica de a accesa baze de date din cadrul aplicatiilor Java. Trebuie doar sa creem si sa deschidem o conexiune cu baza de date, sa scriem o interogare intr-un anumit dialect SQL, sa fixam parametri interogarii, sa executam interogarea, sa ne uitam la rezultate si sa inchidem conexiunea. Astfel ca, accesul la date este plictisitor si implica multe operatiuni standard.

Hibernate este un proiect orientat pe managementul persistent data in Java. Suita Hibernate include Hibernate ORM, Hibernate EntityManager, Hibernate Search, Hibernate Validator, Hibernate OGM, Hibernate Envers, sau Hibernate Reactive [1].

Hibernate ORM tine de suita framework-ului Hibernate. Ofera un API si un core pentru persistarea informatiilor in bazele de date. Hibernate ORM este baza pentru multe alte proiecte din cadrul acestei suite. Este un framework independent si poate sa fie folosit pe orice versiune moderna a Java si chiar impreuna cu alte framework-uri (cum ar fi Spring sau Jakarta Enterprise Edition) [1].

Spring Data este un cumul de proiecte ce tin de frameworkul Spring, framework al carui scop este sa simplifice accesul atat la bazele de date relationale cat si la cele NoSQL.

Suita Spring Data include mai multe proiecte precum Spring Data Commons, Spring Data JPA, Spring Data JDBC, Spring Data MongoDB, Spring Data Redis.

Spring Data JPA abordeaza implementarea JPA-based repositories. Ofera suport imbunatatit pentru layerele de acces la date JPA-based reducand codul standard si creand implementari pentru interfetele arhivelor.

Atat Hibernate cat si Spring Data sunt ambele frameworks. Intr-un framework, flow-ul de lucru este deja inclus, avem hook points pe care trebuie sa le completam cu cod pentru a implementa functiile domain-specific.

Un framework este mai complex decat o librarie. Defineste un schelet unde aplicatia poate include propriile functionalitati. Astfel, codul va fi apelat de framework cand este nevoie. Programatorii trebuie sa se concentreze in principal pe implementarea business logic.

Framework-urile se bazeaza pe idea de “Inversion of Control”. Librariile expun API-uri care ar putea sa fie apelate din aplicatiile programatorului. Cand un software developer isi scrie propriul cod, el va apela o metoda care apartine unei clase din cadrul unei librarii, mentinand in acelasi timp controlul asupra flow-ului de lucru. Insa un framework iti apeleaza codul, rezultand astfel idea de “Inversion of Control”.

Intern, framework-urile Java se bazeaza pe reflection capabilities.

Reflectia sau introspectia este capacitatea unui program de a-si inspecta si schimba structura si comportmentul in cadrul runtime. Java Reflection API poate sa vizualizeze informatia despre clase, interfete, metode, campuri, constructori si adnotari in cadrul Java program runtime. Framework-urile nu au nevoie de numele elementelor inspectate pentru a face asta, dar s-ar putea sa le gaseasca la runtime si sa schimbe comportamentul programului.

Datorita utilizarii lor intense in cadrul framework-urilor si cresterii in popularitate a acestora in ultimii ani, Java si-a imbunatatit la randul ei perfomantele capacitatilor de reflectie in noile versiuni [5].

In aceasta serie de articole vom compara JPA, Hibernate si Spring Data JPA si vom vedea in ce situatii este bine sa lucram cu fiecare dintre ele.

REFERENCES

[1] Christian Bauer, Gavin King, and Gary Gregory, Java Persistence with Hibernate, Second Edition. Manning, 2015
[2] Codd, E.F., “A relational model of data for large shared data banks.” [Communications of the ACM 13 (6): 377–87, 1970].
[3] Date, C.J., SQL and Relational Theory: How to Write Accurate SQL Code, 3rd edition. O’Reilly Media, 2015.
[4] Ramez Elmasri and Shamkant Navathe, Fundamentals of Database Systems. Pearson, 2016.
[5] Radu Şerban, Cătălin Tudose, Carmen Odubăşteanu, Java Reflection Performance Analysis Using Different JDKs, CSCS 18, 2011

Vrei sa inveti mai multe despre aceasta tehnologie? Descopera cursurile noastre.

Catalin Tudose
Java and Web Technologies Expert

Originally published at https://www.luxoft-training.ro.

--

--

https://www.luxoft-training.com/

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store