Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+687новых вакансий за сутки·55 254вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 791
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python7 042
  • Облачные технологии5 085
  • QA вакансии1 814
  • Android1 199
  • Инженер данных831
  • Продакт-менеджер339

Разработка

  • iOS1 135
  • Backend вакансии1 131
  • Fullstack вакансии475
  • AI вакансии458
  • Frontend вакансии404
  • Mobile вакансии27

По стеку

  • Go4 093
  • Java2 435
  • Kotlin990
  • Node.js827
  • Rust665
  • .NET525
  • PHP282
  • C++223
  • C#199

DevOps и инфраструктура

  • Kubernetes2 931
  • Linux-инфраструктура2 312
  • DevOps вакансии2 110
  • Terraform / IaC1 714
  • CI/CD872
  • Мониторинг и Observability825
  • SRE253
  • Кибербезопасность50

Аналитика и данные

  • Аналитик данных497
  • Data Scientist463
  • Бизнес-аналитик374
  • Системный аналитик54

Другие направления

  • Проджект-менеджер119
  • UI/UX дизайн72
  • Ручное тестирование14

По регионам

  • Вакансии в США25 531
  • Вакансии в Европе9 792
  • Работа в России3 193
  • Вакансии в Канаде2 236

По формату

  • Удалённые вакансии43 578
  • Релокация в США25 531
  • Гибридная работа4 289
  • Офисная работа3 340

По уровню

  • Senior вакансии21 650
  • Middle вакансии12 211
  • Junior вакансии3 886

Сейчас нанимают

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise125 вакансий
  • Celonis28 вакансий
  • Infobip28 вакансий
  • Spotify24 вакансии
  • Adyen17 вакансий
  • Darktrace17 вакансий
  • Monzo13 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме HibernateВсе вопросы
HibernateMiddleТеория

В чём разница между методами get() и load() в Hibernate?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

get() сразу идёт в БД и возвращает null если запись не найдена; load() возвращает прокси и делает SELECT только при обращении к полям, бросая ObjectNotFoundException при отсутствии записи.

Метод get()

Session.get(Class, id) немедленно выполняет SELECT в базу данных. Если запись не найдена — возвращает null. Никакой прокси не создаётся.

Session session = sessionFactory.openSession();
Employee emp = session.get(Employee.class, 42L);
if (emp == null) {
    System.out.println("Сотрудник не найден");
} else {
    System.out.println(emp.getName());
}

get() и load() в Hibernate: ключевые различия

Оба метода позволяют получить объект из базы данных по первичному ключу, но работают принципиально по-разному.

Метод load()

Session.load(Class, id) возвращает прокси-объект (Javassist/ByteBuddy) без обращения к БД. SQL выполняется только при первом обращении к полю, отличному от идентификатора. Если записи не существует — при инициализации прокси выбрасывается ObjectNotFoundException.

Session session = sessionFactory.openSession();
// SQL ещё не выполнялся
Employee empProxy = session.load(Employee.class, 99L);
// SQL выполняется здесь; если записи нет — ObjectNotFoundException
System.out.println(empProxy.getName());

Сравнительная таблица

  • Обращение к БД: get() — немедленно; load() — отложено (lazy).
  • Если запись не найдена: get() — возвращает null; load() — бросает ObjectNotFoundException.
  • Тип возвращаемого объекта: get() — реальный экземпляр сущности; load() — прокси-объект.
  • Первичный кэш (L1): оба сначала смотрят в кэш первого уровня.
  • Сессия закрыта до инициализации прокси: load() бросает LazyInitializationException.

Когда использовать load()

Типичный сценарий — назначение связи без реальной загрузки данных. Например, при создании записи нужно выставить внешний ключ, зная только идентификатор:

// Не делаем лишний SELECT — просто устанавливаем связь
Department dept = session.load(Department.class, deptId);
Employee emp = new Employee();
emp.setName("Ivan");
emp.setDepartment(dept); // INSERT с FK, без SELECT department
session.persist(emp);

Современная альтернатива (JPA)

В JPA-стиле вместо get() используется EntityManager.find(), вместо load() — EntityManager.getReference(). Поведение аналогично.

// find — аналог get()
Employee e = em.find(Employee.class, 42L); // null если не найден

// getReference — аналог load()
Department dRef = em.getReference(Department.class, 10L); // прокси

Подводные камни

  • LazyInitializationException: прокси, полученный через load(), нельзя инициализировать после закрытия сессии — доступ за пределами транзакции приведёт к исключению.
  • ObjectNotFoundException vs null: если код ожидает null, а использует load(), исключение появится в неожиданном месте — далеко от места вызова.
  • instanceOf и конкретный тип: прокси — это подкласс сущности, поэтому proxy.getClass() != Employee.class; используйте Hibernate.getClass(entity) или instanceof.
  • equals()/hashCode() на прокси: если реализация опирается на getClass(), сравнение прокси с реальным объектом даёт false.
  • Кэш первого уровня: если объект уже загружен в сессию, load() вернёт не прокси, а реальный объект — поведение меняется в зависимости от порядка вызовов.
  • Устаревший API: Session.load() и Session.get() помечены как deprecated в Hibernate 6 — предпочтительны JPA-методы find() и getReference().

Частые вопросы на собеседовании

  • Что такое проблема N+1 в Hibernate и как её решить?
  • Что такое lazy loading в Hibernate и когда возникает LazyInitializationException?
  • В чём разница между SessionFactory и Session в Hibernate?
  • Что такое Hibernate и что такое ORM (Object-Relational Mapping)?

Типичные ошибки

  • Путать термин «get vs load» с соседним механизмом Hibernate.
  • Не называть границу lifecycle, transaction, thread или request для «get vs load».
  • Игнорировать production-эффекты «get vs load»: latency, SQL shape, memory, security или observability.

Что проверяет интервьюер

  • Попросить объяснить механизм «get vs load» на минимальном примере.
  • Проверить, видит ли кандидат failure mode и диагностику для «get vs load».
  • Уточнить, какие настройки или API меняют «get vs load» в реальном сервисе.

Как вы знаете этот вопрос?

Проверить себя по теме Hibernate →

Источники

  • https://docs.hibernate.org/orm/current/javadocs/org/hibernate/Session.html
←Предыдущий вопросВ чём разница между `save()`, `persist()`, `saveOrUpdate()` и `merge()` в Hibernate?Следующий вопрос→Какие преимущества даёт Hibernate по сравнению с чистым JDBC?

Связанные темы

Hibernatebackend-designtechnical-communication