Объясни отношение «один ко многим» (One-to-Many) на примере из предметной области.

«Объясни отношение «один ко многим» (One-to-Many) на примере из предметной области.» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Отношение «один ко многим» (One-to-Many) означает, что одна сущность (родительская) может быть связана с несколькими экземплярами другой сущности (дочерней). Обратное отношение — «многие к одному» (Many-to-One).

Пример: Блог и его посты. Один блог (Blog) может содержать множество постов (Post), но каждый пост принадлежит только одному блогу.

Реализация в JPA/Hibernate (Java):

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

    // Владелец связи. Один Блог -> Много Постов.
    // CascadeType.ALL: операции с блогом применяются к его постам.
    // orphanRemoval = true: пост удаляется из БД при удалении из коллекции.
    @OneToMany(mappedBy = "blog", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Post> posts = new ArrayList<>();

    // Метод для корректного управления связью с обеих сторон
    public void addPost(Post post) {
        posts.add(post);
        post.setBlog(this);
    }
    // getters, setters, конструкторы
}

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

    // Обратная сторона связи. Много Постов -> Один Блог.
    // @JoinColumn определяет столбец внешнего ключа в таблице `post`.
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "blog_id")
    private Blog blog;
    // getters, setters, конструкторы
}

Объяснение аннотаций:

  • @OneToMany(mappedBy = "blog"): Связь управляется полем blog в классе Post. Столбец внешнего ключа находится в таблице Post.
  • @ManyToOne: Определяет обратную сторону связи. FetchType.LAZY — посты загружаются только при обращении к ним (оптимизация производительности).
  • Внешний ключ: В таблице post будет столбец blog_id, ссылающийся на blog.id.

Схема в БД:

CREATE TABLE blog (id BIGINT PRIMARY KEY, name VARCHAR(255));
CREATE TABLE post (
    id BIGINT PRIMARY KEY, 
    title VARCHAR(255), 
    blog_id BIGINT, 
    FOREIGN KEY (blog_id) REFERENCES blog(id)
);