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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python14 623
  • Облачные технологии10 965
  • QA вакансии3 255
  • Backend вакансии1 723
  • Инженер данных1 270
  • Продакт-менеджер586

Разработка

  • Android1 706
  • iOS1 579
  • AI вакансии822
  • Fullstack вакансии697
  • Frontend вакансии598
  • Mobile вакансии30

По стеку

  • Go8 025
  • Java5 176
  • Node.js1 637
  • Kotlin1 393
  • Rust1 331
  • .NET1 254
  • PHP541
  • C++384
  • C#352

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

  • Kubernetes6 272
  • Linux-инфраструктура4 763
  • DevOps вакансии4 564
  • Terraform / IaC3 459
  • Мониторинг и Observability1 587
  • CI/CD1 478
  • SRE458
  • Кибербезопасность127

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

  • Аналитик данных683
  • Бизнес-аналитик638
  • Data Scientist622
  • Системный аналитик92

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

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

По регионам

  • Вакансии в США34 823
  • Вакансии в Европе15 244
  • Работа в России3 882
  • Вакансии в Канаде3 408

По формату

  • Удалённые вакансии54 624
  • Релокация в США34 823
  • Гибридная работа9 269
  • Офисная работа6 545

По уровню

  • Senior вакансии33 244
  • Middle вакансии15 490
  • Junior вакансии5 355

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

Все компании
  • Wise194 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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