Пам'ятаєте проект із третього модуля по фронтенду, де потрібно було реалізувати адмінку для rpg для серверного API? Якщо хтось пам'ятає – там на сервері як сховище використовувалася карта. Звичайно, у реальному житті такі сховища не використовують, а використовують бази даних. Метою цього проекту буде написати альтернативну реалізацію шару репозиторію з використанням Hibernate.

Для цього потрібно:

  1. Зробити fork з репозиторію
  2. Завантажити свою версію проекту на комп'ютер.
  3. Додати залежності в pom.xml:
    • mysql: mysql-connector-java: 8.0.30
    • org.hibernate: hibernate-core-jakarta: 5.6.11.Final
  4. Зробити maven білд (mvn clean install). Для різноманітності використовуємо Java версії 1.8.
  5. Додати конфігурацію запуску через Ідею. Реалізацію цього пункту можна переглянути в лекції https://javarush.com/ua/quests/lectures/ua.jru.module3.lecture02 (пункт 4). Єдина відмінність – інша назва артефакту. Якщо все зробив правильно і запустив програму – побачиш приблизно таку картину:
  6. У Workbench виконати скрипт створення схеми rpg:
    CREATE SCHEMA `rpg` ;
    
  7. Опціонально . Якщо хочеш подивитися яку очікується поведінку, можеш у класі com.game.service.PlayerServiceв параметрі конструктора значення інструкції @Qualifierзмінити з «db» на «memory» . У цьому випадку Spring буде використовувати як реалізації інтерфейсу IPlayerRepositoryклас PlayerRepositoryMemory. Після тесту не забудь змінити значення інструкції @Qualifierназад на «db» .
  8. Розставити всі необхідні інструкції в ентіті-класі com.game.entity.Player. Таблиця має називатися "player", схема "rpg". Для єнамів використовуй @Enumerated(EnumType.ORDINAL)крім анотації @Column. Нагадаю, що довжина поля name має бути до 12 символів, поля title – до 30 символів. Абсолютно всі поля не повинні бути null.
  9. У класі PlayerRepositoryDBдодай private final поле SessionFactory sessionFactory, у конструкторі класу ініціалізуй це поле. Проперти використовуй як у звичайних завданнях (працюватимемо з БД MySQL версії 8). З цікавого – додай
    properties.put(Environment.HBM2DDL_AUTO, "update");
    
    Це дозволить не створювати таблицю вручну (або через виконання SQL скрипта).
  10. Реалізуй усі методи класу. Для різноманітності давай вчинимо так:
    • Метод getAllреалізуй через NativeQuery — цей метод повинен отримувати всіх гравців з урахуванням параметрів: pageNumber – номер сторінки, pageSize – кількість записів на сторінку
    • Метод getAllCount реалізуй через NamedQuery. Повинен повертати загальну кількість гравців у базі даних.
    • У методі beforeStopвиклич у sessionFactoryметод close. За рахунок наявності анотації над методом @PreDestroySpring викличе цей метод перед зупинкою програми, і це дозволить валідно звільнити всі ресурси системи.
    • Реалізація інших методів на твій розсуд. Але не забувай про транзакції та коміти для методів, які як або змінюють вміст БД.
  11. Запусти програму. Якщо все зробив правильно – ти отримаєш робочу програму. Ось тільки даних там немає, так що виконай через Workbench скрипт init.sql (з ресурсів), щоб вони з'явабося. Після цього в браузері натисніть на F5 і перевіряй, що всі методи ти реалізував правильно.
  12. Було б цікаво подивитись, які саме запити виконує Hibernate, тому додамо логування запитів. Для цього додай в pom.xml залежність p6spy: p6spy: 3.9.1 . У папці ресурсів створи файл spy.properties , в якому вкажи:
    driverlist=com.mysql.cj.jdbc.Driver
    dateformat=yyyy-MM-dd hh:mm:ss a
    appender=com.p6spy.engine.spy.appender.StdoutLogger
    logMessageFormat=com.p6spy.engine.spy.appender.MultiLineFormat
    
    І в конструкторі класу PlayerRepositoryDB зміни дві опції:
    properties.put(Environment.DRIVER, "com.p6spy.engine.spy.P6SpyDriver");
    properties.put(Environment.URL, "jdbc:p6spy:mysql://localhost:3306/rpg");
    
    Тепер у виведенні сервера по кожному запиту ти бачитимеш 2 рядки. Перша – який стейтмент підготовлений, другий – запит із вставленими параметрами.

Ось і все, проект готовий, вітаю тебе!

Насправді, для роботи з Hibernate із Spring використовується інший підхід, про який ми розповімо у п'ятому модулі.


Розбір проекту.