1.1 Съпоставяне на класове към таблици

След като научите JDBC, най-вероятно имате впечатлението, че работата с база данни от Java приложение все още е удоволствие. Ами ако ви кажа, че цялата тази работа може да се направи 10 пъти по-лесно?

Кое е основното предимство на езика SQL? Това е декларативен език - той описва Howво искаме да получим и не казва нищо за това How да го направим. Как - това е грижа на SQL сървъра.

Същият подход може да се използва при работа с бази данни.

В един идеален свят бихме могли просто да напишем SQL заявки към базата данни и в отговор ще получим готови Java обекти or колекции от Java обекти, ако поискаме няколко части.

Какво мога да кажа, това е, което няколко момчета си помислиха през 2000 г. и решиха да напишат своя собствена ORM рамка.

ORM означава Object-Relational Mapping и по същество е картографиране на Java обекти към SQL заявки.

Момчетата измислиха много просто нещо - всяка table в базата данни трябва да съответства на няHowъв клас в Java приложението . В Java приложение ние работим с обекти и тези обекти вече знаят How да се запишат в базата данни.

Имаше три подхода за решаване на този проблем и те изглеждаха по следния начин:

  1. Обектът се записва в базата данни и актуализира своите полета въз основа на информация от базата данни.
  2. Обектът може да се запише в базата данни, но никога не инициира този случай.
  3. Обектът съдържа само данни и някой го записва в базата данни и го зарежда от базата данни.

Първоначално доминираше първият подход, след това бяха популярни сървърите на applications и Enterprise Java Beans. Имаше дори цял клас компоненти, наречени Persistence EJB, които сами можеха да се записват в базата данни.

Но един ден всичко се промени...

1.2 Поява на Hibernate

През 2001 г. беше пусната първата version на рамката Hibernate. Това беше много проста рамка, но позволяваше използването на обикновени „глупави обекти“, които не знаеха нищо за това How трябва да се съхраняват в базата данни or да се зареждат от там.

Картографирането на полета на Java класове и колони в table в базата данни беше зададено с помощта на XML файл. А понякога бяха доста обемисти. Добре, кого шегувам. Те бяха масивни платна от XML code. И ситуацията беше спасена само от факта, че преди 20 години нямаше такива гигантски бази данни като сега.

Но всъщност най-мощното решение беше най-накрая да се отдели обектът, който трябва да бъде записан в базата данни, от codeа, който го е записал там . Това решение не е наистина очевидно. Тъй като принципът на капсулирането гласи, че обектът знае най-добре How трябва да бъде съхраняван и зареден.

И ORM подходът наистина нарушава тази концепция. Класът данни разкрива вътрешната си структура, но стана много по-лесно да се работи с групи от обекти от различни типове.

Голям пробив дойде след пускането на Java 5 , когато две неща се появиха в JDK:

  • анотации
  • прокси

анотацииXML бързо беше изместен и сега беше лесно да се зададат всички необходими настройки за съпоставяне на Java клас към table в базата данни направо в Java класа.

Проксине толкова забележими за потребителя на Hibernate, но техният принос беше още по-сериозен. Когато заявите конкретен обект or обекти от Hibernate, той просто ви връща мъниче (прокси) и прихваща всички извиквания към неговите методи.

Това направи възможно прилагането на различни механизми за мързеливо зареждане и повиши скоростта и ефективността на Hibernate до абсолютно високо ниво за това време. Hibernate се превърна не само в де факто индустриален стандарт - той започна да се превежда на други езици. Така например се появи Framework NHibernate за C#.

1.3 Поява на JPA

Де факто, последвано от де юре признание. Разработчиците на JDK решиха да създадат спецификация за това How правилно да картографират обекти към таблици в база данни. Тази спецификация се наричаJPA- Java Persistence API.

Точно това е спецификацията. Описва How трябва да работи всичко и Howви анотации са ни необходими, за да маркираме различни части от класа, ако искаме неговите обекти да бъдат записани в базата данни.

Изглежда, че момчетата просто са взели Hibernate като основа и са променor имената на пакетите от него. Тъй като всички анотации, които бяха в Hibernate, се преместиха в JPA почти една по една.

Днес Hibernate напълно прилага цялата JPA спецификация, Howто и някои допълнителни функции, които правят работата с него още по-удобна. Следователно, по отношение на стандартизацията, можем да кажем, че Hibernate има два набора от функции:

  • JPA стандарт
  • Hibernate Native API (допълнителна функционалност)

Официалната documentация на Hibernate го описва по следния начин:

Но Howто въз основа на моя опит, така и след препрочитане на documentацията на Hibernate, мога да кажа, че JPA и Hibernate API са 95% еднакви. Те са просто идентични понятия.

1.4 Maven за Hibernate

Тъй като толкова много похвалих Hibernate, мисля, че е време да премина към работата с него малко по-усилено.

Първо, има официален сайт, където има само куп documentация на английски език. Тя, разбира се, има пристрастия към справочната информация, а не към обучението. Но все пак е по-добре от отстраняването на грешки в източниците, нали? :)

Инструкция:

  1. Отваряте линка .
  2. Гледаш я дълго време.
  3. Връщам се към CodeGym.
  4. Четете по-нататъшните ми лекции.

Моята работа е да опростявам сложни неща и да ги обяснявам с прости думи. И ако сте достигнали това ниво, тогава мога да го направя.

Е, за да започнете с Hibernate, трябва да го добавите към вашия pom.xml. Към днешна дата вече е налична 6-та version на Hibernate, or по-скоро 6.1.1, така че ще научим How да работим с най-новата version.

Просто добавете тези редове към вашия pom.xml:

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

Ако четете тази лекция извън прозореца на 2023+, тогава новата version може да бъде изтеглена тук .

важно! Някои от библиотеките, които Hibernate използва, са остарели в JDK 11 и JDK 17, така че ако имате проблеми със стартирането и стартирането на вашия проект, добавете тези зависимости към него:

<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>