Новое: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Теория

Какие типы ассоциаций существуют в Hibernate: @OneToOne, @OneToMany, @ManyToOne, @ManyToMany?

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

ManyToOne — owner FK, OneToMany — inverse через mappedBy, OneToOne — уникальный FK, ManyToMany — join-таблица. По умолчанию ManyToOne/OneToOne EAGER — всегда переключайте на LAZY.

@ManyToOne

Наиболее распространённый тип. Сторона @ManyToOne является owner ассоциации — именно в её таблице хранится foreign key. Hibernate генерирует колонку автоматически или её можно переопределить через @JoinColumn.

@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "customer_id", nullable = false)
    private Customer customer;
}

По умолчанию fetch-стратегия EAGER — это частая ловушка. Всегда явно указывайте FetchType.LAZY.

Типы ассоциаций в Hibernate

Hibernate поддерживает четыре типа ассоциаций, соответствующих отношениям между таблицами в реляционной БД. Каждый тип определяет, сколько записей одной сущности связано с записями другой, и влияет на то, какой стороне принадлежит foreign key.

@OneToMany

Обратная сторона @ManyToOne. Как правило, является inverse стороной через mappedBy, что означает: эта сторона не управляет foreign key, а лишь отражает связь. Без mappedBy Hibernate создаст отдельную join-таблицу.

@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Order> orders = new ArrayList<>();

    // Обязательно поддерживайте обе стороны вручную
    public void addOrder(Order order) {
        orders.add(order);
        order.setCustomer(this);
    }
}

@OneToOne

Связь один-к-одному. Owner стороны содержит foreign key с UNIQUE constraint. Inverse сторона использует mappedBy.

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "profile_id", unique = true)
    private UserProfile profile;
}

@Entity
public class UserProfile {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne(mappedBy = "profile")
    private User user;
}

@ManyToMany

Реализуется через промежуточную join-таблицу. Hibernate управляет ею автоматически через @JoinTable. Однако в production почти всегда лучше заменить @ManyToMany явной сущностью-связкой с дополнительными атрибутами (дата, статус и т.д.).

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany
    @JoinTable(
        name = "student_course",
        joinColumns = @JoinColumn(name = "student_id"),
        inverseJoinColumns = @JoinColumn(name = "course_id")
    )
    private Set<Course> courses = new HashSet<>();
}

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

  • FetchType.EAGER по умолчанию в @ManyToOne и @OneToOne приводит к N+1 проблеме при обходе коллекций. Всегда используйте LAZY и загружайте через JOIN FETCH при необходимости.
  • Отсутствие mappedBy в @OneToMany без явной @JoinTable заставляет Hibernate создать скрытую join-таблицу вместо использования FK в дочерней таблице.
  • Несинхронизированные обе стороны: при двунаправленной связи изменение только одной стороны в памяти ведёт к некорректному состоянию первого уровня кэша до flush.
  • @ManyToMany с List вместо Set вызывает полное удаление и повторную вставку всех записей join-таблицы при любом изменении коллекции — используйте Set.
  • CascadeType.ALL на @ManyToMany опасен: удаление одного студента может каскадно удалить общие курсы.
  • equals/hashCode: без корректной реализации на основе бизнес-ключа (не id) поведение Set для managed/detached сущностей непредсказуемо.
  • Cartesian product: одновременная fetch-загрузка нескольких @OneToMany коллекций через JOIN FETCH порождает декартово произведение строк — используйте @BatchSize или несколько запросов.

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

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

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

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

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

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

Источники

  • https://docs.hibernate.org/orm/current/userguide/html_single/
←Предыдущий вопросЧто такое eager loading и каковы его компромиссы по сравнению с lazy loading?Следующий вопрос→Как Hibernate решает ошибку `detached entity passed to persist`?

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

Hibernatebackend-designtechnical-communication

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

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