В этом руководстве я покажу вам, как реализовать однонаправленное сопоставление Spring JPA One-To-One с Hibernate в примере Spring Boot, используя @OneToOne аннотация. Вы узнаете:

  • Как настроить Spring Data, JPA, Hibernate для работы с базой данных
  • Как определить модели данных и интерфейсы репозитория для отношений JPA One-To-One
  • Способ использования Spring JPA для взаимодействия с базой данных для ассоциации One-To-One
  • Способ создания Spring Rest Controller для обработки HTTP-запросов

Полная статья на:

Подходящий способ реализации сопоставления JPA/Hibernate One To One

В реляционной базе данных отношение «один к одному» между таблицей A и таблицей B указывает на то, что одна строка в таблице A связана только с одной строкой в ​​таблице B, и наоборот.

Например, вам нужно разработать модель данных для учебного блога, в котором Один У учебника есть соответствующие детали (дата, время, когда он был создан, автор, которым он был создан). Итак, это ассоциация «один к одному».

Вы можете использовать таблицу соединений (с @JoinTable аннотацию). Он хранит значения первичного ключа от обоих сущностей в НОВЫЙ стол.

jpa-hibernate-один-к-одному-соединяемая-таблица

Другой способ — использовать общий первичный ключ, при этом внешний ключ находится в tutorial_details стол. Учебный объект — это родительа Подробная информация об учебном пособии — это ребенок.

jpa-hibernate-один к одному

Вы можете сопоставить дочерний объект с родительским, используя JPA/Hibernate. @Один к одному аннотация. И в этом случае отношения определяет только дочерняя сторона. Мы называем это однонаправленной ассоциацией «один к одному».

Теперь посмотрите на tutorial_details таблица, содержащая столбец первичного ключа (id) и столбец внешнего ключа (tutorial_id). Вы можете видеть, что нам действительно нужен только один tutorial_details (дочерняя) строка, связанная с руководство (родительская) строка, а дочерние данные почти не используются в других отношениях. Таким образом, мы можем опустить ребенка id столбец:

jpa-hibernate-один-к-одному-пример

Пример JPA один к одному

Мы собираемся создать проект Spring с нуля, затем реализуем однонаправленное сопоставление JPA/Hibernate One to One с помощью tutorials а также tutorial_details таблица следующая:

jpa-hibernate-один-к-одному-пример

Мы также пишем Rest Apis для выполнения операций CRUD над сущностями Details.

Вот API, которые нам необходимо предоставить:

МетодыURL-адресаДействия
ПОЧТА/api/tutorials/:id/деталисоздать новые детали для учебника
ПОЛУЧИТЬ/api/детали/:идентификаторполучить детали по :id
ПОЛУЧИТЬ/api/tutorials/:id/деталиполучить подробную информацию об учебнике
ПОМЕЩАТЬ/api/детали/:идентификаторобновить детали по :id
ПОМЕЩАТЬ/api/tutorials/:id/деталиобновить сведения об учебнике
УДАЛИТЬ/api/детали/:идентификаторудалить детали по :id
УДАЛИТЬ/api/tutorials/:id/деталиудалить детали учебника
УДАЛИТЬ/api/учебники/:идентификаторудалить учебник (и его детали)

Предположим, что у нас было учебники такая таблица:

jpa-hibernate-один-к-одному-родительская-таблица

Вот примеры запросов:

  • Создайте новый объект Details: POST /api/tutorials/[:id]/details

jpa-hibernate-один-к-одному-создать

tutorial_details таблица после этого:

jpa-hibernate-один-к-одному-таблица

  • Получить сведения о конкретном учебнике: GET /api/tutorials/[:id]/details или же /api/details/[:id]

jpa-hibernate-один-к-одному-извлечение

  • Обновить сведения о конкретном учебнике: PUT /api/tutorials/[:id]/details или же /api/details/[:id]

jpa-hibernate-один-к-одному-обновление

  • Удалить Детали конкретного учебника: УДАЛИТЬ /api/tutorials/[:id]/details или же /api/details/[:id]

jpa-hibernate-один-к-одному-удалить

Проверить tutorial_details таблица, строка с tutorial_id=1 удалена:

jpa-hibernate-один-к-одному-удалить-БД

  • Удалить учебник: УДАЛИТЬ /api/tutorials/[:id]

jpa-hibernate-один-к-одному-удалить-родителя

Учебник (id=3) и его детали были удалены:

jpa-hibernate-один-к-одному-удалить-родительскую-таблицу

Давайте создадим наш пример Spring Boot Data JPA One to One.

Пример Spring Boot один к одному

Технологии

  • Ява 8
  • Spring Boot 2.7.2 (с Spring Web MVC, Spring Data JPA)
  • H2/MySQL/PostgreSQL
  • Мавен 3.8.1

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

spring-data-jpa-один-к-одному-однонаправленный

Позвольте мне объяснить это кратко.

Tutorial, TutorialDetails класс модели данных соответствует сущности и таблице учебники, tutorial_details.
TutorialRepository, TutorialDetailsRepository интерфейсы, которые расширяют JpaРепозиторий для методов CRUD и пользовательских методов поиска. Он будет автоматически подключен в TutorialController, TutorialDetailsController.
TutorialController, TutorialDetailsController находятся Рестконтроллерs, который имеет методы сопоставления запросов для запросов RESTful CRUD API.
– Конфигурация источника данных Spring, JPA и Hibernate в приложение.свойства.
пом.xml содержит зависимости для Spring Boot и базы данных MySQL/PostgreSQL/H2.

— О исключение package, чтобы не усложнять этот пост, я не буду объяснять это. Для получения более подробной информации вы можете прочитать следующий учебник:
Пример @RestControllerAdvice в Spring Boot

Шаг за шагом и исходный код Github можно найти по адресу:

Дальнейшее чтение

Пользовательский запрос с @Query аннотация:
Пример Spring JPA @Query: Пользовательский запрос в Spring Boot

Если вы хотите добавить разбивку на страницы в этот проект Spring, вы можете найти инструкцию по адресу:
Пример разбиения на страницы и фильтрации Spring Boot | Spring JPA, постраничный

Чтобы отсортировать/упорядочить по нескольким полям:
Spring Data JPA Сортировка/Упорядочивание по нескольким столбцам | Весенний ботинок

Обработка исключения для этого Rest API необходима:

Или способ написать модульный тест для репозитория JPA:
Модульный тест Spring Boot для репозитория JPA с @DataJpaTest

Вы также можете знать:

Полное приложение CRUD:

Исходный код

Вы можете найти полный исходный код для этого руководства на Гитхаб.

Один ко многим: Пример JPA One To Many с Hibernate и Spring Boot
Многие ко многим: Пример JPA «многие ко многим» с Hibernate в Spring Boot

Вы можете применить эту реализацию в следующих учебниках:

Дополнительные производные запросы по адресу:
Пример запроса репозитория JPA в Spring Boot