Метод 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.

Метод 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.

Метод find()

Метод find() дістався інтерфейс Session від стандарту JPA. А ти знаєш, цей стандарт описує не просто сигнатуру методів, а й регламентує поведінку.

Цей метод працює так само, як і метод get() . Якщо об'єкт за переданим ключем не знайдено, то метод просто поверне null.

User user = session.find(User.class, -2); //метод поверне null

Метод refresh()

Ще один корисний метод, який стосується завантаження об'єкта з бази – це метод refresh() .

Пам'ятаєш метод persist() , який оновлював дані базі на основі переданого об'єкта? Так ось, метод refresh() працює з точністю та навпаки: він оновлює існуючий об'єкт на основі даних із бази.

Така поведінка буває потрібна, якщо, наприклад, при записі об'єкта в базу там викликаються різні процедури, що зберігаються, які коригують записані дані.

У разі буває корисно перечитати об'єкт із бази, якщо є ймовірність, що він змінився. Приклад:

User user = new User();
user.setName("Колян");
session.persist(user);
session.flush();  //Примусово викликали SQL INSERT та виклик тригерів

session.refresh(user);
//Тут далі працюємо з оновленим об'єктом