JavaRush /Курсы /Модуль 4. Работа с БД /Разные способы получения объекта

Разные способы получения объекта

Модуль 4. Работа с БД
11 уровень , 3 лекция
Открыта

Метод 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);
//тут дальше работаем с обновленным объектом
1
Задача
Модуль 4. Работа с БД, 11 уровень, 3 лекция
Недоступна
task1103
Попробуй достать из БД объект класса Animal с id + 1. Используй методы...
Комментарии (6)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Надежда Уровень 104 Expert
17 сентября 2023
Про метод refresh(), как мне кажется, более понятное объяснение: Метод refresh() в контексте Hibernate обновляет состояние объекта в памяти до состояния, которое соответствует данным в базе данных. Другими словами, он сбрасывает все изменения, сделанные в объекте в памяти, и заменяет их данными из базы данных. Представьте, что у вас есть объект в памяти, который отображает строку в таблице базы данных. Если вы внесли изменения в этот объект, но хотите вернуть его к состоянию, которое было в момент загрузки из базы данных, вы можете использовать refresh(). Этот метод обновит поля объекта значениями из базы данных, отменяя все внесенные изменения. Коротко говоря, refresh() позволяет вам обновить объект данными из базы данных, если вам нужно убедиться, что вы работаете с актуальной информацией из базы.
13 мая 2023
session.flush(); без открытой транзакции выбросит исключение.
6 февраля 2023

Помнишь метод persist(), который обновлял данные в базе на основе переданного объекта? Так вот, метод refresh() работает с точностью да наоборот: он обновляет существующий объект на основе данных из базы.
Здесь, скорее всего, вместо persist() должен стоять merge()
aDuVaN4Ik Уровень 42
15 января 2023

User user = session.load(User.class, new Integer(123));
Нельзя было тут просто указать 123?
Владимир Уровень 108
30 мая 2023
Я думаю Entity имеет поле id с типом Integer. Если передать просто 123, то передастся примитивный int и будет исключение. Но я не проверял
Надежда Уровень 104 Expert
17 сентября 2023
Можно указать просто 123 вместо new Integer(123) при использовании метода session.load(). Hibernate позволяет передавать объекты, обернутые в соответствующие классы-обертки, или использовать примитивные типы.