Hibernate — пример отображения один ко многим One-To-Many и Many-To-One

Большинство баз данных содержат в себе зависимости вида «один ко многим» и «многие ко многим». Здесь будет рассмотрен пример отображения «один ко многим» и показана реализация извлечения данных из таблицы с помощью Java кода и аннотаций.

Update:

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

Используемые технологии:

Hibernate 5.0.1.Final

Maven 3.2.5

IntelliJ IDEA 14

MySQL 5.6.25

1. Описание задачи

Рассмотреть основные настройки для реализации зависимости один ко многим (One-to-Many). Получить данные из таблицы с помощью простого Java кода.

2. Структура проекта

Проект основан на предыдущих статьях и использует тот же код и таблицы. Для понимания того, что здесь используется и откуда берутся данные рекомендую сначала прочесть (там же есть код таблиц и базы данных):

Hibernate – быстрый старт. Пример приложения Hello World

Hibernate – примеры Criteria. Обзор Hibernate Criteria API

Используемая база данных выглядит так:

Hibernate QuickStart table diagram

Таблица с контактами:

Hibernate One-to-Many example, ContactTable

И детали номера для определенного контакта:

Hibernate One-to-Many example, ContactDetails

3. Настройка сущностей для маппинга данных

Итак, для этого примера нам требуется настроить две сущности для таблицы контактов и таблицы с деталями о телефонных номерах этих контактов для получения данных с помощью Hibernate. Новый код для связи один ко многим будет выделен относительно предыдущего примера.

3.1. Отображение один ко многим

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

Нажмите чтобы посмотреть весь код класса контактов:

Метод извлечения атрибута contactTelDetails аннотирован с помощью аннотации @OneToMany, указывающей на наличие отношения “один ко многим” с классом ContactTelDetailEntity. Этой аннотации передается несколько атрибутов. Атрибут mappedBy задает свойство в классе ContactTelDetailEntity, которое предоставляет ассоциацию (т.е. связано с определением внешнего ключа в таблице CONTACT_TEL_DETAIL). Атрибут cascade означает, что операция обновления должна распространяться на дочерние записи. Атрибут orphanRemoval указывает, что после обновления деталей телефонных номеров контакта записи, которые больше не существуют в наборе, должны быть удалены из базы данных.

Теперь класс ContactTelDetailEntity, в котором настроено отображение ассоциации:

Весь код:

Аннотация @ManyToOne (для нескольких телефонов есть один контакт) задает другую сторону ассоциации с ContactEntity. Так же был переопределен метод toString() с добавлением getContact().getId(), чтобы легче было просматривать результат.

4. Извлечение данных из таблицы

Был создан простенький интерфейс ContactDao с методами с понятными названиями

Его реализация ContactDaoImpl (Только один метод задействован)

в методе поиска всех контактов используется простой запрос HQL, который выводит все найденные записи из таблицы ContactEntity.

5. Извлечение контактов из базы данных

Вызываем метод findAll у экземпляра contactDAO и полученный список выводим в консоль:

5.1. Извлечение данных с использованием связи Один ко Многим (One-to-Many)

Для получения контактов и их телефонных номеров используется метод listContactsWithDetail()

Получаем для нашей базы данных следующий результат

Т.к. в базе данных только два номера для контакта с id=3, то мы получаем соответствующий результат.

 

Ссылки для скачивания

Hibernate OneToMany — исходники Java

SQLHibernate OneToMany — MySQL база данных с заполненными таблицами

Share Button
11
41219 Total Views 1 Views Today

One thought on “Hibernate — пример отображения один ко многим One-To-Many и Many-To-One

  1. Игровые автоматы:

    Привет! Создайте ссылочный ключ в таблице дочерней сущности, если отношение однонаправленное; в противном случае, используйте отношение «многие-к-одному» для создания двунаправленного отношения.

Добавить комментарий