Introducere

În acest tutorial, vom discuta despre Hibernate și Java Persistence API (JPA) – cu accent pe diferențele dintre ele.

Vom începe prin a explora ce este JPA, cum este utilizat și conceptele de bază din spatele său.

Apoi, vom arunca o privire asupra modului în care Hibernate și EclipseLink se potrivesc în acest tablou.

Object-Relational Mapping

Înainte de a ne scufunda în JPA, este important să înțelegem conceptul de Object-Relational Mapping – cunoscut și sub numele de ORM.

Obiect-relational mapping este pur și simplu procesul de persistență a oricărui obiect Java direct într-un tabel de bază de date. De obicei, numele obiectului care este persistat devine numele tabelului, iar fiecare câmp din acel obiect devine o coloană. Cu tabelul configurat, fiecare rând corespunde unei înregistrări din aplicație.

An Introduction to JPA

Apif de persistență Java, sau JPA, este o specificație care definește gestionarea datelor relaționale într-o aplicație Java. API-ul cartografiază un set de concepte care definește ce obiecte din cadrul aplicației ar trebui să fie persistate și cum ar trebui să le persiste.

Este important să rețineți aici că JPA este doar o specificație și că are nevoie de o implementare pentru a funcționa – dar mai multe despre asta mai târziu.

Acum, să discutăm câteva dintre conceptele de bază JPA pe care o implementare trebuie să le acopere.

3.1. Entity

Clasa javax.persistence.Entity definește ce obiecte trebuie să fie persistate în baza de date. Pentru fiecare entitate persistată, JPA creează o nouă tabelă în cadrul bazei de date alese.

În plus, toate entitățile alese trebuie să definească o cheie primară denotată prin adnotarea @Id. Împreună cu adnotarea @GeneratedValue, definim că cheia primară ar trebui să fie generată automat atunci când înregistrarea este persistată în baza de date.

Să aruncăm o privire asupra unui exemplu rapid de entitate descrisă de JPA.

@Entitypublic class Car { @GeneratedValue @Id public long id; // getters and setters}

Amintiți-vă că, în prezent, acest lucru nu va avea nici un efect asupra aplicației – JPA nu furnizează nici un cod de implementare.

3.2. Persistența câmpurilor

Un alt concept de bază al JPA este persistența câmpurilor. Atunci când un obiect în Java este definit ca o entitate, toate câmpurile din cadrul acestuia sunt automat persistate ca diferite coloane în cadrul tabelului entității.

Dacă există un câmp în cadrul unui obiect persistat pe care nu dorim să îl persistăm în baza de date, putem declara câmpul tranzitoriu cu adnotarea @Transient.

3.3. Relații

În continuare, JPA specifică modul în care trebuie să gestionăm relațiile dintre diferitele tabele din baza de date din cadrul aplicației noastre. După cum am văzut, JPA gestionează acest lucru cu ajutorul adnotărilor. Există patru adnotări de relații de care trebuie să ținem cont:

  1. @OneToOne
  2. @OneToMany
  3. @ManyToOne
  4. @ManyToMany

Să aruncăm o privire asupra modului în care funcționează acest lucru:

@Entitypublic class SteeringWheel { @OneToOne private Car car // getters and setters}

În exemplul nostru de mai sus, clasa SteeringWheel descrie o relație unu la unu cu clasa noastră Car de mai devreme.

3.4. Entity Manager

În cele din urmă, clasa javax.persistence.EntityManager specifică operațiile către și din baza de date. EntityManager conține operațiile comune de creare, citire, actualizare și ștergere (CRUD) care sunt persistate în baza de date.

Impletări JPA

După ce specificația JPA definește cum și ce ar trebui să persistăm, acum trebuie să alegem un furnizor de implementare care să furnizeze codul necesar. Fără un astfel de furnizor, ar trebui să implementăm toate clasele relevante pentru a fi în conformitate cu JPA, iar asta înseamnă multă muncă!

Există o mulțime de furnizori din care putem alege, fiecare afișând propriile avantaje și dezavantaje. Atunci când luăm o decizie cu privire la care să îl folosim, ar trebui să luăm în considerare câteva dintre următoarele puncte:

  1. Maturitatea proiectului – de cât timp există furnizorul și cât de bine documentat este acesta?
  2. Subproiecte – are furnizorul vreun subproiect util pentru noua noastră aplicație?
  3. Suportul comunității – există cineva care să ne ajute atunci când ajungem să avem un bug critic?
  4. Benchmarking – cât de performantă este implementarea?

În timp ce nu vom intra în profunzime cu privire la evaluarea comparativă a diferiților furnizori JPA, JPA Performance Benchmark (JPAB) conține informații valoroase în acest sens.

După aceasta, haideți să aruncăm o scurtă privire asupra unora dintre furnizorii de top de JPA.

Hibernate

În esența sa, Hibernate este un instrument de cartografiere obiect-relațională care oferă o implementare a JPA. Hibernate este una dintre cele mai mature implementări JPA existente, cu o comunitate uriașă care susține proiectul.

Implementează toate clasele javax.persistence pe care le-am analizat mai devreme în articol, precum și oferă funcționalități dincolo de JPA – instrumente Hibernate, validare și căutare. Deși aceste API-uri specifice Hibernate pot fi utile, ele nu sunt necesare în aplicațiile care necesită doar funcționalitatea JPA de bază.

Să aruncăm o privire rapidă la ceea ce oferă Hibernate cu adnotarea @Entity.

În timp ce îndeplinește contractul JPA, @org.hibernate.annotations.Entity adaugă metadate suplimentare care depășesc specificațiile JPA. Acest lucru permite ajustarea fină a persistenței entităților. De exemplu, să ne uităm la câteva adnotări oferite de Hibernate care extind funcționalitatea @Entity:

  1. @Table – ne permite să specificăm numele tabelului creat pentru entitate
  2. @BatchSize – specifică dimensiunea lotului atunci când se recuperează entități din tabel

De asemenea, merită să remarcăm câteva dintre caracteristicile suplimentare pe care JPA nu le specifică, care se pot dovedi utile în aplicații mai mari:

  1. Declarații CRUD personalizabile cu adnotările @SQLInsert, @SQLUpate și @SQLDelete
  2. Suport pentru ștergerea soft
  3. Entități imuabile cu adnotarea @Immutable

Pentru o incursiune mai profundă în Hibernate și persistența Java – mergeți la seria noastră de tutoriale de persistență Spring.

EclipseLink

EclipseLink, construit de Fundația Eclipse, oferă o implementare JPA cu sursă deschisă. În plus, EclipseLink suportă o serie de alte standarde de persistență, cum ar fi Java Architecture for XML Binding (JAXB).

Simplu spus, mai degrabă decât să persiste un obiect într-un rând de bază de date, JAXB îl mapează într-o reprezentare XML.

În continuare, prin compararea aceleiași implementări a adnotării @Entity, vedem că EclipseLink oferă din nou extensii diferite. În timp ce nu există o adnotare pentru @BatchSize, așa cum am văzut mai devreme, EclipseLink oferă alte opțiuni pe care Hibernate nu le oferă.

De exemplu:

  1. @ReadOnly – specifică faptul că entitatea care urmează să fie persistată este doar pentru citire
  2. @Struct – definește clasa pentru a fi mapată la un tip „struct” al bazei de date

Pentru a citi mai multe despre ceea ce EclipseLink are de oferit, accesați ghidul nostru despre EclipseLink cu Spring.

Concluzie

În acest articol, am analizat API-ul de persistență Java, sau JPA.

În cele din urmă, am explorat modul în care acesta diferă de Hibernate și EclipseLink.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.