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

+1 582новые вакансии за сутки·92 562вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python17 105
  • Облачные технологии14 068
  • QA вакансии3 460
  • Backend вакансии2 098
  • Инженер данных1 796
  • Продакт-менеджер1 248

Разработка

  • Android1 866
  • iOS1 699
  • Fullstack вакансии979
  • AI вакансии951
  • Frontend вакансии742
  • Mobile вакансии44

По стеку

  • Go8 651
  • Java6 544
  • Node.js2 018
  • .NET1 719
  • Kotlin1 623
  • Rust1 453
  • C#709
  • PHP683
  • C++571

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

  • Kubernetes7 761
  • DevOps вакансии6 057
  • Linux-инфраструктура5 492
  • Terraform / IaC4 259
  • CI/CD3 240
  • Мониторинг и Observability1 782
  • SRE565
  • Кибербезопасность450

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

  • Data Scientist1 127
  • Бизнес-аналитик925
  • Аналитик данных845
  • Системный аналитик154

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

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

По регионам

  • Вакансии в США43 686
  • Вакансии в Европе23 668
  • Вакансии в Канаде4 413
  • Работа в России3 909

По формату

  • Удалённые вакансии73 889
  • Релокация в США43 686
  • Гибридная работа12 392
  • Офисная работа7 088

По уровню

  • Senior вакансии42 236
  • Middle вакансии20 545
  • Junior вакансии6 653

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML166 вакансий
  • Grab138 вакансий
  • Celonis39 вакансий
  • Spotify36 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace16 вакансий

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

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

Что такое lazy loading в Hibernate и когда возникает LazyInitializationException?

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

Lazy loading откладывает загрузку связей до момента обращения к ним. LazyInitializationException возникает, когда сессия уже закрыта, а прокси-объект пытается выполнить SQL-запрос для загрузки данных.

Как работает lazy loading

По умолчанию @OneToMany и @ManyToMany имеют FetchType.LAZY. Hibernate возвращает прокси-объект (PersistentBag/PersistentSet) вместо реальных данных. SQL SELECT для связи выполняется только при первом обращении к коллекции или полю — и только пока Session открыта.

@Entity
public class Department {
    @Id
    private Long id;

    @OneToMany(mappedBy = "department", fetch = FetchType.LAZY)
    private List<Employee> employees; // прокси, данные не загружены
}

// В рамках открытой сессии — OK
try (Session session = sessionFactory.openSession()) {
    Department dept = session.get(Department.class, 1L);
    int count = dept.getEmployees().size(); // SQL выполнится здесь
}

// После закрытия сессии — LazyInitializationException
Department dept;
try (Session session = sessionFactory.openSession()) {
    dept = session.get(Department.class, 1L);
} // сессия закрыта
dept.getEmployees().size(); // EXCEPTION!

Причины LazyInitializationException

  • Сущность загружена в сервисном слое, возвращена контроллеру — к тому моменту транзакция (и сессия) уже завершена.
  • Использование Open Session in View антипаттерна без его настройки.
  • Сериализация сущности (Jackson) вне транзакции.
  • Детач сущности через session.evict(entity) или EntityManager.detach().

Решение 1: JOIN FETCH в запросе

String hql = "SELECT d FROM Department d JOIN FETCH d.employees WHERE d.id = :id";
Department dept = session
    .createQuery(hql, Department.class)
    .setParameter("id", 1L)
    .uniqueResult();
// employees уже загружены, сессия не нужна

Решение 2: EntityGraph (JPA 2.1+)

@NamedEntityGraph(
    name = "Department.withEmployees",
    attributeNodes = @NamedAttributeNode("employees")
)
@Entity
public class Department { ... }

// Применение
EntityGraph<?> graph = em.getEntityGraph("Department.withEmployees");
Department dept = em.find(Department.class, 1L,
    Map.of("javax.persistence.fetchgraph", graph));

Решение 3: Hibernate.initialize()

// Принудительная загрузка внутри открытой сессии
try (Session session = sessionFactory.openSession()) {
    Department dept = session.get(Department.class, 1L);
    Hibernate.initialize(dept.getEmployees()); // загрузить сейчас
    return dept;
}
// dept.getEmployees() доступен вне сессии

Решение 4: DTO-проекция

String hql = "SELECT new com.example.dto.DeptSummary(d.name, COUNT(e)) "
    + "FROM Department d LEFT JOIN d.employees e GROUP BY d.name";
List<DeptSummary> result = session.createQuery(hql, DeptSummary.class).getResultList();
// DTO — простые объекты, никакого lazy loading

Решение 5: @Transactional охватывает всё чтение

@Service
public class DepartmentService {
    @Transactional(readOnly = true)
    public DepartmentDto getWithEmployees(Long id) {
        Department dept = repo.findById(id).orElseThrow();
        dept.getEmployees().size(); // сессия открыта, OK
        return mapper.toDto(dept);
    }
}

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

  • Open Session in View: в Spring Boot включён по умолчанию (spring.jpa.open-in-view=true) — скрывает проблему, но выполняет SQL прямо в слое представления. Отключайте его и явно загружайте нужные данные.
  • EAGER не панацея: FetchType.EAGER на @OneToMany вызывает N+1 при любом запросе коллекции сущностей.
  • JOIN FETCH + пагинация: Hibernate предупреждает HHH90003004 и делает пагинацию в памяти — сначала загружает всё, потом обрезает.
  • Несколько JOIN FETCH коллекций: нельзя делать JOIN FETCH двух bag-коллекций одновременно (MultipleBagFetchException) — используйте Set или загружайте в два запроса.
  • Детач через serialization: Jackson пытается сериализовать все поля, включая lazy-прокси. Используйте @JsonIgnore или DTO.
  • session.load() vs session.get(): load() всегда возвращает прокси (даже для скалярных значений) — LazyInitializationException может прийти неожиданно даже без коллекций.
  • Транзакционный прокси и self-invocation: вызов @Transactional-метода из того же бина не создаёт транзакцию — сессия не открывается, lazy loading падает.

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

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

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

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

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

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

Источники

  • https://docs.hibernate.org/orm/current/userguide/html_single/
←Предыдущий вопросЧто такое проблема N+1 в Hibernate и как её решить?Следующий вопрос→В чём разница между `SessionFactory` и `Session` в Hibernate?

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

Hibernatebackend-designtechnical-communication

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

  • Что такое проблема N+1 в Hibernate и как её решить?
  • В чём разница между SessionFactory и Session в Hibernate?
  • Что такое Hibernate и что такое ORM (Object-Relational Mapping)?
  • Как Hibernate управляет транзакциями базы данных и как он интегрируется с @Transactional Spring?