1.1 Класты кестелермен сәйкестендіру
JDBC-ті оқыған соң, бәлкім Java-қосымшадан дерекқормен жұмыс жасау - керемет емес деп ойлауың мүмкін. Ал егер бұл жұмысты 10 есеге оңайлатуға болады десем ше?
SQL тілінің басты артықшылығы неде? Ол - декларативті тіл, яғни не алғымыз келетінін сипаттайды, бірақ оны қалай жүзеге асырамыз - мүлдем айтпайды. Ол - SQL сервердің міндеті.
Бұл тәсілді де дерекқормен жұмыс жасағанда қолдануға болады.
Идеялық әлемде, біз жай ғана дерекқорға SQL сұрауларын жазып, жауап ретінде дайын Java-объектілерді алсақ болар еді, немесе бірнешеуін сұраған жағдайда Java-объектілердің коллекцияларын.
Дәл осылай, 2000 жылы бірнеше жігіт ойлап, өздерінің ORM framework жасап көрді.

ORM дегеніміз, Object-Relational Mapping болып келеді және негізінен Java-объектілерді SQL сұрауларына сәйкестендіру болып табылады.
Жігіттер өте қарапайым нәрсе ойлап тапты — дерекқордағы әрбір кестеге Java-қосымшада бір класс сәйкес келуі керек. Java қосымшада біз объектілермен жұмыс жасаймыз, ал бұл объектілер өздерін дерекқорға сақтауды өздері біледі.
Бұл мәселені шешудің үш тәсілі болды, және олар шамамен былай көрінді:
- Объект өзін дерекқорға сақтайды және өзінің өрістерін дерекқордағы ақпарат негізінде жаңартады.
- Объект өзін дерекқорға сақтауды біледі, бірақ бұл жұмыстың бастамашысы ешқашан болмайды.
- Объект тек деректерді қамтиды, ал біреу оны дерекқорға сақтайды және дерекқордан жүктейді.
Алғашында бірінші тәсіл үстемдік етті, сол кезде Application-серверлер мен Enterprise Java Beans танымал болды. Persistence EJB деп аталатын тұтас бобтар классы болған, олар дерекқорға өзін-өзі сақтай алатын.
Бірақ бір күні бәрі өзгерді…
1.2 Hibernate пайда болуы
2001 жылы Hibernate фреймворкының алғашқы нұсқасы шықты. Бұл өте қарапайым фреймворк болды, бірақ ол әдеттегі "ақымақ объектілерді" пайдалануға мүмкіндік берді, оларды дерекқорға қалай сақтауды немесе жүктеуді білмейтін.

Java-кластың өрістері мен дерекқор кестесіндегі бағандарды сәйкестендіру XML-файлмен анықталатын. Кейде олар айтарлықтай көлемді болатын. Жақсы, кіммен алдаймын. Бұл алып XML-код заты болды. Ал жағдайды тек 20 жыл бұрын осындай үлкен дерекқорлар болмағаны ғана сақтап қалды.
Бірақ ең мықты шешім — объекті дерекқорға сақтау керек болған объектіден оны сақтайтын кодты ажырату болды. Бұл шынында түсініксіз шешім. Өйткені инкапсуляция принципі объектіні қалай сақтау және жүктеу керек екендігін ең жақсы білетінін айтады.

ORM тәсілі шынында бұл концепцияны бұзады. Data-класс өзінің ішкі құрылымын ашады, бірақ әртүрлі типтердегі объектілер тобымен жұмыс жасау едәуір жеңілдейді.
Java 5 шыққан соң маңызды өзгеріс болды, JDK-де екі нәрсе пайда болғанда:
- Аннотациялар
- Proxy
Аннотациялар XML-ді тез ығыстырды және енді Java-класс ішінде дерекқор кестесіне сәйкестендіру үшін қажет барлық баптауларды оңай көрсетуге болатын.
Прокси Hibernate қолданушысына онша байқалмайды, бірақ олардың үлесі одан да маңызды болды. Сен Hibernate-тен белгілі бір объект немесе объектілерді сұрағанда, ол жай ғана саған заглушка (proxy) береді, және барлық оған сілтемелерді ұстап алады.
Бұл әртүрлі Lazy Loading механизмдерін жүзеге асыруға мүмкіндік беріп, Hibernate жұмыс жылдамдығы мен тиімділігін сол уақыт үшін орасан зор деңгейге көтерді. Hibernate де-факто индустрия стандартқа айналды, оны басқа тілдерге аударуды бастады. Мысалы, C# үшін NHibernate Framework пайда болды.
1.3 JPA пайда болуы
Де-факто болғаннан кейін де-юре мойындау келді. JDK әзірлеушілері дерекқор кестесіне объектілерді қалай дұрыс сәйкестендіру керектігіне спецификация құруды шешті. Бұл спецификация JPA — Java Persistence API деп аталады.
Бұл спецификация. Ол бәрі қалай жұмыс істеуі керек екендігін және дерекқорға сақтау үшін кластың әртүрлі бөліктерін қандай аннотациялармен белгілеу керек екендігін сипаттайды.
Жігіттер, мүмкін, жай ғана Hibernate-негізін алып, оның пакет атауларын өзгертті деген сезім бар. Өйткені Hibernate-де болған барлық аннотациялар дерлік JPA-ға көшті.

Бүгінгі күні Hibernate JPA-ның бүкіл спецификациясын толық жүзеге асырады, сондай-ақ онымен жұмыс істеуді одан да ыңғайлы ететін кейбір қосымша мүмкіндіктерді ұсынады. Сондықтан стандарттау тұрғысынан, Hibernate-те екі функциялар жинағы бар деп айтуға болады:
- JPA стандарт
- Hibernate Native API (қосымша функционал)
Hibernate ресми құжаттамасында бұл былай сипатталады:

Бірақ менің тәжірибем негізінде және Hibernate құжаттамасын қайта оқуымнан кейін айта аламын, JPA және Hibernate API 95% сәйкес келеді. Бұл жай ғана тектес ұғымдар.
1.4 Maven Hibernate үшін
Hibernate-ті сонша мақтағандығымнан, онымен тығыз жұмыс істеу уақыты келді деп ойлаймын.
Біріншіден, ресми сайт бар, онда көптеген ағылшын тіліндегі құжаттама бар. Ол, әрине, анықтамалық ақпаратқа қарай бейімделген, оқу ақпарат емес. Бірақ бәрібір, осылай болғаны жақсырақ емес пе, бастапқы кодтарды дебаг жасауға қарағанда? :)
Инструкция:
- Сілтемені аш.
- Ұзақ уақыт қара.
- JavaRush-ке орал.
- Менің келесі лекцияларымды оқы.
Менің жұмысым күрделі нәрселерді оңайлатудан тұрады және оларды қарапайым сөздермен түсіндіру. Егер сен осы деңгейге жетсең, демек менің жұмысым дұрыс.
Ал Hibernate-пен жұмыс істеуге кірісу үшін, оны өзіңнің pom.xml файлыңа қосуың керек. Бүгінгі күнге ұсынымды 6-нұсқасы, нақтырақ айтқанда 6.1.1, сондықтан ең соңғы нұсқамен жұмыс істеуді үйренеміз.
Просто добавь в свой pom.xml такие строки:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.1.1.Final</version>
</dependency>
Егер сен бұл лекцияны оқып әрі жыл 2023+ болса, онда жаңа нұсқаны осы жерден жүктеп алуға болады.
Маңызды! 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>
GO TO FULL VERSION