JPA (Java Persistance API) – специфікація, документ, в якому описані правила та API для реалізації принципів ORM для Java (анотації, налаштування, підхід).
JPA має безліч реалізацій:
• OpenJPA (Apache)
• Hibernate
• TopLink (Oracle)
• EclipceLink
Часто використовується запис JPA API.
XML налаштування
• При запуску Hibernate зчитує налаштування зі спеціальних файлів конфігурації XML (або Java конфігурації)
• Можна використовувати будь-який із 2-х файлів:
• hibernate.cfg.xml – для Hibernate – може містити додаткові параметри, які будуть працювати тільки в Hibernate реалізації.
• persistence.xml –для будь-якої реалізації JPA (у тому числі Hibernate) – обмежений специфікацією
Мінімальні налаштування
• Для з'єднання з БД –десктоп проекти:
• <property name="connection.url">
• <property name="connection.username">
• <property name="connection.password">
• Або для веб-додатків:
• <property name="hibernate.connection.datasource" >
Діалект
• Кожна СУБД має свій dialect-доповнення та відмінності для SQL запитів (на основі ANSI SQL)
• Hibernate вміє визначати автоматично потрібний діалект.
SessionFactory (в JPA – EntityManagerFactory)
• Створюється лише 1 раз під час запуску програми
• Налаштування та робота з сесіями
• Під час створення SessionFactory – зчитуються налаштування hibernate.cfg.xml
Session (в JPA – EntityManager)
• Часто використовується термін "persistence context"
• Для маніпуляції із персистентними об'єктами
• Є розширеним інтерфейсом для EntityManager (EntityManager + своє API)
(аналогічно до SessionFactory)
• Якщо в прикладах документації або статтях зустрічаєте змінну entityManager, замість неї можна підставляти об'єкт Session (тільки для Hibernate реалізації JPA).
• Hibernate створив «надбудову» над реалізацією JPA і додав свої класи та інтерфейси.
• Як зазначено у документації Hibernate – бажано вміти «читати» діаграми залежностей, щоб розуміти структуру класів
Mapping
• Mapping – процес опису зв'язків між POJO та таблицею БД для створення persistent object («persist» -зберігати)
• Persistent Object (персистентний об'єкт) – POJO, який представляє таблицю з БД
• Для мапінгу можна використовувати 2 способи:
• За допомогою XML файлу (Java окремо –mapping конфігодельно)
• За допомогою анотацій у POJO (всі разом в одному класі).
• Кожен спосіб має свої плюси та мінуси
Анотації JPA
• @Entity – головна інструкція, яка робить Entity зі звичайного POJO класу
• @Table – не обов'язкова інструкція, якщо не потрібно уточнити параметри mapping-таблиці
• @Id – позначає первинний ключ
• @GeneratedValue –генерація ID при додаванні нового запису
• @Column – не обов'язкова інструкція, якщо не потрібно уточнити параметри стовпця
• @Transient - якщо потрібно виключити поле
Примітки
• JPA API-пакети javax.persistence.*
• Hibernate API-пакети org.hibernate.*
• Entity клас має бути не final, мати конструктор без параметрів (докладніше у розділі "2.1 The Entity Class")
Criteria API
• Використання об'єктів замість написання SQL (ООП орієнтований варіант)
• Більш динамічний спосіб створення запитів (умови, параметри та ін.)
• Багато помилок запобігають етапу компіляції (type safe)
• Не зовсім інтуїтивний API
• Через складний API – можлива громіздкість коду
HQL (Hibernate Query Language)
• Якщо вам зручніше працювати із SQL запитами, ніж із об'єктами
• Працює з персистентними об'єктами, а не таблицями БД
• Легше читати
• У JPA використовується JPQL -Java Persistence Query Language (HQL – більш розширений варіант JPQL)
• Зрештою перетворюється на потрібний SQL формат, згідно з діалектом СУБД «звичайний» SQL
Native SQL
• «Звичайні» SQL запити, як із JDBC
• Самостійно потрібно дотримуватись діалекту СУБД
• Не універсальний, як HQL
• Працює з таблицями БД, а не персистентними об'єктами
Який спосіб використати?
• Усі способи мають практично однакові можливості
• Різниця – у синтаксисі
• В останніх версіях Hibernate різниці у продуктивності мінімальні
Робота з даними
1. Створити потрібний запит у будь-який спосіб (Criteria, HQL, Native SQL)
2. Якщо запит типу select перетворити до потрібного типу:
• Колекція об'єктів.
• Унікальний об'єкт.
• Примітивне значення.
Колекції
• Найчастіший варіант типу даних при запитах до БД
• Тип колекції під час оголошення має бути типом інтерфейсу (List, Set…)
• Обов'язково використовуємо типізовані колекції (List<Author>)
Поодинокий об'єкт
• Отримання ID (готові методи в об'єкті Session).
• Отримання будь-яких полів (створювати SQL запити вручну).