1. Метод get()
Якщо ти хочеш отримати об'єкт за його ID (або Primary Key), для цього Hibernate має аж цілих три методи:
- load()
- get()
- find()
Роблять вони одне й те саме, проте є нюанси. Загальний формат методу get() має вигляд:
EntityClass ім'я = session.get(EntityClass.class, Object primaryKey);
Метод get() як другий параметр приймає ID (Primary Key) об'єкта, який йому потрібно повернути. Потім завантажує цей об'єкт із бази та повертає його. Приклад:
User user = session.get(User.class, 2);
Якщо запис з таким ID не знайдеться в базі, то метод поверне null.
2. Метод load()
Другий метод для завантаження об'єкта — це метод load(). Загальний формат load() такий самий:
EntityClass ім'я = session.load(EntityClass.class, Object primaryKey);
Проте його поведінка відрізняється від методу get().
По-перше, цей метод повертає не реальний об'єкт, а proxy: віртуальну заглушку.
По-друге, під час використання методу load() не відбувається перевірка, чи є такий запис у базі. Натомість Hibernate одразу створює proxy-об'єкт з переданим ID і повертає його.
По-третє, вся робота з базою даних відбуватиметься під час виклику методів proxy-об'єкта. Якщо ти спробуєш викликати, наприклад, метод getName(), тоді й відбудеться перше звернення до бази. Приклад:
User user = session.load(User.class, new Integer(123));
String name = user.getName(); //Ось тут відбудеться перше звернення до бази
Метод load() не варто використовувати для перевірки наявності об'єктів у базі — він цього просто не покаже. До того ж, якщо до нього передати невалідний ID, наприклад, null, він просто поверне null.
3. Метод find()
Метод find() дістався інтерфейсу Session від стандарту JPA. А ти знаєш, цей стандарт описує не просто сигнатуру методів, а й регламентує поведінку.
Цей метод працює так само, як і метод get(). Якщо об'єкт за переданим ключем не знайшовся, метод просто поверне null.
User user = session.find(User.class, -2); //метод поверне null
4. Метод refresh()
Ще один корисний метод, який стосується завантаження об'єкта з бази — це refresh().
Пам'ятаєш метод persist(), який оновлював дані в базі на основі переданого об'єкта? Так ось, метод refresh() працює з точністю та навпаки: він оновлює існуючий об'єкт на основі даних з бази.
Така поведінка буває потрібна, якщо, наприклад, під час запису об'єкта до бази там викликаються різні процедури, що зберігаються, які коригують записані дані.
У таких випадках корисно перечитати об'єкт з бази, якщо є ймовірність, що він змінився. Приклад:
User user = new User();
user.setName("Микола");
session.persist(user);
session.flush(); //Примусово викликали SQL INSERT та виклик тригерів
session.refresh(user);
//Тут далі працюємо з оновленим об'єктом
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ