← Назад к вопросам

Какие виды ассоциаций поддерживает Hibernate?

2.2 Middle🔥 161 комментариев
#ORM и Hibernate

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ассоциации в Hibernate

Ассоциация — это связь между двумя сущностями в базе данных. Hibernate поддерживает четыре основных вида ассоциаций, которые определяют кардинальность связи между объектами.

1. One-to-One (Один-к-одному)

Это отношение, где каждой записи в одной таблице соответствует ровно одна запись в другой таблице.

@Entity
public class Person {
    @Id
    private Long id;
    private String name;
    
    @OneToOne
    @JoinColumn(name = "passport_id")
    private Passport passport;
}

@Entity
public class Passport {
    @Id
    private Long id;
    private String number;
}

В этом примере каждый человек имеет один паспорт, и каждый паспорт принадлежит одному человеку.

2. One-to-Many (Один-к-многим)

Это наиболее распространённое отношение, где одна запись в главной таблице связана с несколькими записями в зависимой таблице.

@Entity
public class Author {
    @Id
    private Long id;
    private String name;
    
    @OneToMany(mappedBy = "author", cascade = CascadeType.ALL)
    private List<Book> books = new ArrayList<>();
}

@Entity
public class Book {
    @Id
    private Long id;
    private String title;
    
    @ManyToOne
    @JoinColumn(name = "author_id")
    private Author author;
}

Анотация mappedBy = "author" указывает, что сторона Book содержит обратную ссылку. CascadeType.ALL обеспечивает каскадное удаление книг при удалении автора.

3. Many-to-One (Многие-к-одному)

Это обратная сторона One-to-Many отношения. Многие записи в одной таблице ссылаются на одну запись в другой таблице.

@Entity
public class Department {
    @Id
    private Long id;
    private String name;
}

@Entity
public class Employee {
    @Id
    private Long id;
    private String name;
    
    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;
}

Много сотрудников могут работать в одном отделе.

4. Many-to-Many (Многие-ко-многим)

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

@Entity
public class Student {
    @Id
    private Long id;
    private String name;
    
    @ManyToMany
    @JoinTable(
        name = "student_course",
        joinColumns = @JoinColumn(name = "student_id"),
        inverseJoinColumns = @JoinColumn(name = "course_id")
    )
    private List<Course> courses = new ArrayList<>();
}

@Entity
public class Course {
    @Id
    private Long id;
    private String title;
    
    @ManyToMany(mappedBy = "courses")
    private List<Student> students = new ArrayList<>();
}

Аннотация @JoinTable определяет промежуточную таблицу со связями на обе стороны.

Направление ассоциации

Ассоциации могут быть:

  • Однонаправленные — только одна сторона знает о связи
  • Двунаправленные — обе стороны могут навигировать по связи

Важные параметры

  • cascade — определяет, как операции (сохранение, удаление) распространяются на связанные объекты
  • fetch = FetchType.LAZY — отложенная загрузка (по умолчанию для многих)
  • fetch = FetchType.EAGER — немедленная загрузка
  • orphanRemoval = true — удаление потерявшихся связанных объектов

Эти четыре вида ассоциаций позволяют моделировать любые сложные отношения между сущностями в вашем приложении.