Метод 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);
//тут дальше работаем с обновленным объектом
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ