Метод 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);
//тут дальше работаем с обновленным объектом
undefined
1
Задача
Модуль 4. Работа с БД, 11 уровень, 3 лекция
Недоступна
task1103
Попробуй достать из БД объект класса Animal с id + 1. Используй методы...