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

+1 199новых вакансий за сутки·93 838вакансий открыто сейчас·Новое:Talanto осенью: фильтры с числами, отклик по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 222
  • Облачные технологии14 171
  • QA вакансии3 456
  • Backend вакансии2 114
  • Инженер данных1 801
  • Продакт-менеджер1 247

Разработка

  • Android1 858
  • iOS1 698
  • Fullstack вакансии997
  • AI вакансии955
  • Frontend вакансии755
  • Mobile вакансии44

По стеку

  • Go8 752
  • Java6 593
  • Node.js2 036
  • .NET1 739
  • Kotlin1 618
  • Rust1 472
  • C#717
  • PHP690
  • C++579

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

  • Kubernetes7 787
  • DevOps вакансии6 095
  • Linux-инфраструктура5 508
  • Terraform / IaC4 287
  • CI/CD3 272
  • Мониторинг и Observability1 792
  • SRE566
  • Кибербезопасность454

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

  • Data Scientist1 138
  • Бизнес-аналитик921
  • Аналитик данных858
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США44 166
  • Вакансии в Европе24 014
  • Вакансии в Канаде4 535
  • Работа в России3 867

По формату

  • Удалённые вакансии75 005
  • Релокация в США44 166
  • Гибридная работа12 485
  • Офисная работа7 090

По уровню

  • Senior вакансии42 643
  • Middle вакансии20 960
  • Junior вакансии6 708

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab137 вакансий
  • Celonis38 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 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