1.1 Maparea claselor la tabele

După ce înveți JDBC, cel mai probabil ai impresia că lucrul cu o bază de date dintr-o aplicație Java este încă o plăcere. Dacă ți-aș spune că toată această muncă ar putea fi făcută de 10 ori mai ușor?

Care este principalul avantaj al limbajului SQL? Acesta este un limbaj declarativ - descrie ceea ce vrem să obținem și nu spune nimic despre cum să o facem. Cum - aceasta este preocuparea serverului SQL.

Aceeași abordare poate fi folosită atunci când lucrați cu baze de date.

Într-o lume ideală, am putea pur și simplu să scriem interogări SQL în baza de date și, ca răspuns, am primi obiecte Java gata făcute, sau colecții de obiecte Java, dacă am solicita mai multe piese.

Ce pot să spun, asta au crezut mai mulți tipi în 2000 și au decis să-și scrie propriul cadru ORM.

ORM înseamnă Object-Relational Mapping și este în esență o mapare a obiectelor Java la interogări SQL.

Băieții au venit cu un lucru foarte simplu - fiecare tabel din baza de date trebuie să corespundă unei clase din aplicația Java . Într-o aplicație Java, operăm cu obiecte, iar aceste obiecte știu deja cum să se salveze în baza de date.

Au existat trei abordări pentru a rezolva această problemă și arătau cam așa:

  1. Obiectul se salvează în baza de date și își actualizează câmpurile pe baza informațiilor din baza de date.
  2. Obiectul este capabil să se salveze în baza de date, dar nu inițiază niciodată acest caz.
  3. Obiectul conține doar date, iar cineva îl salvează în baza de date și îl încarcă din baza de date.

Inițial, prima abordare a dominat, apoi serverele de aplicații și Enterprise Java Beans au fost populare. Exista chiar și o întreagă clasă de boabe numite Persistence EJB, care se puteau salva în baza de date.

Dar într-o zi totul s-a schimbat...

1.2 Apariția lui Hibernate

În 2001, a fost lansată prima versiune a cadrului Hibernate. Era un cadru foarte simplu, dar permitea folosirea unor „obiecte stupide” obișnuite care nu știau nimic despre cum ar trebui să fie stocate în baza de date sau încărcate de acolo.

Maparea câmpurilor claselor Java și coloanelor dintr-un tabel din baza de date a fost setată folosind un fișier XML. Și uneori erau destul de voluminoase. Bine, cu cine glumesc. Erau pânze voluminoase de cod XML. Iar situația a fost salvată doar de faptul că acum 20 de ani nu existau baze de date atât de gigantice ca acum.

Dar, de fapt, cea mai puternică decizie a fost să se separe în sfârșit obiectul care trebuie salvat în baza de date de codul care l-a salvat acolo . Această soluție nu este chiar evidentă. Deoarece principiul încapsulării prevede că obiectul știe cel mai bine cum trebuie să fie stocat și încărcat.

Iar abordarea ORM chiar rupe acest concept. Clasa de date își expune structura internă, dar a devenit mult mai ușor de operat cu grupuri de obiecte de diferite tipuri.

O descoperire majoră a venit după lansarea Java 5 , când au apărut două lucruri în JDK:

  • Adnotări
  • proxy

AdnotăriXML a fost înlocuit rapid, iar acum a fost ușor să specificați toate setările necesare pentru maparea unei clase Java la un tabel din baza de date chiar în clasa Java.

Proxynu atât de vizibil pentru utilizatorul Hibernate, dar contribuția lor a fost și mai serioasă. Când solicitați un anumit obiect sau obiecte de la Hibernate, acesta vă returnează pur și simplu un stub (proxy) și interceptează toate apelurile către metodele sale.

Acest lucru a făcut posibilă implementarea diferitelor mecanisme de Lazy Loading și a crescut viteza și eficiența Hibernate la un nivel complet ridicat pentru acea perioadă. Hibernate a devenit nu doar un standard de facto al industriei, ci a început să fie tradus în alte limbi. Deci, de exemplu, Framework NHibernate a apărut pentru C#.

1.3 Apariția JPA

De facto urmată de recunoaștere de drept. Dezvoltatorii JDK au decis să creeze o specificație despre cum să mapați corect obiectele la tabele dintr-o bază de date. Această specificație se numeșteJPA- Java Persistence API.

Aceasta este exact specificația. Descrie cum ar trebui să funcționeze totul și ce adnotări avem nevoie pentru a marca diferite părți ale clasei dacă dorim ca obiectele acesteia să fie salvate în baza de date.

Se pare că băieții tocmai au luat Hibernate ca bază și au schimbat numele pachetelor din el. Pentru că toate adnotările care erau în Hibernate s-au mutat în JPA aproape una câte una.

Astăzi, Hibernate implementează pe deplin întreaga specificație JPA, precum și câteva caracteristici suplimentare care fac lucrul cu acesta și mai confortabil. Prin urmare, în ceea ce privește standardizarea, putem spune că Hibernate are două seturi de caracteristici:

  • Standardul JPA
  • Hibernate Native API (funcționalitate suplimentară)

Documentația oficială Hibernate o descrie astfel:

Dar atât pe baza experienței mele, cât și după recitirea documentației Hibernate, pot spune că JPA și API-ul Hibernate sunt 95% la fel. Sunt doar concepte identice.

1.4 Maven pentru Hibernate

Din moment ce am lăudat atât de mult Hibernate, cred că este timpul să trec la lucrul cu el puțin mai greu.

În primul rând, există un site oficial, unde există doar o grămadă de documentație în limba engleză. Ea, desigur, are o părtinire în informațiile de referință, și nu în antrenament. Dar tot e mai bine decât depanarea surselor, nu? :)

Instructiuni:

  1. Deschideți linkul .
  2. Te uiți la ea mult timp.
  3. Revenind la CodeGym.
  4. Ai citit prelegerile mele ulterioare.

Treaba mea este să simplific lucrurile complexe și să le explic în termeni simpli. Și dacă ați atins acest nivel, atunci o pot face.

Ei bine, pentru a începe cu Hibernate, trebuie să îl adăugați la pom.xml. Până în prezent, a șasea versiune de Hibernate este deja disponibilă, sau mai degrabă 6.1.1, așa că vom învăța cum să lucrăm cu cea mai recentă versiune.

Doar adăugați aceste rânduri la pom.xml dvs.:

<dependency>
	<groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
	<version>6.1.1.Final</version>
</dependency>

Dacă citiți această prelegere în afara ferestrei 2023+, atunci noua versiune poate fi descărcată aici .

Important! Unele dintre bibliotecile pe care le folosește Hibernate au fost depreciate în JDK 11 și JDK 17, așa că, dacă întâmpinați probleme la realizarea proiectului, adăugați aceste dependențe:

<dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
      	<version>4.0.0</version>
</dependency>

<dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
      	<version>4.0.0</version>
</dependency>

<dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.29.0-GA</version>
</dependency>