Вопрос проверяет понимание различий между методами get и load в Hibernate, включая их поведение при отсутствии объекта в базе данных.
Методы get() и load() в Hibernate используются для получения сущности по её идентификатору, но ведут себя по-разному в плане загрузки данных и обработки отсутствующих записей.
get() сразу выполняет SQL-запрос к базе данных и возвращает реальный объект сущности. Если запись с указанным ID не существует, метод возвращает null. Это удобно, когда нужно точно знать, есть ли объект в БД, и избежать исключений.
Session session = sessionFactory.openSession();
User user = session.get(User.class, 1L);
if (user == null) {
System.out.println("Пользователь не найден");
} else {
System.out.println(user.getName());
}
session.close();load() не выполняет запрос сразу, а возвращает прокси-объект (заглушку), который содержит только идентификатор. Реальный запрос к БД происходит только при первом обращении к любому свойству сущности (кроме ID). Если объект не существует, при обращении к свойствам выбрасывается ObjectNotFoundException.
Session session = sessionFactory.openSession();
User user = session.load(User.class, 1L);
// Запроса ещё не было
System.out.println(user.getName()); // Здесь выполняется SELECT и, если нет записи, исключение
session.close();Вывод: get() безопаснее для проверки наличия записи, а load() эффективнее при работе с существующими объектами, когда можно отложить запрос к БД.