Нужна лучшая сущность и дизайн запроса для получения объекта с несколькими ассоциациями - PullRequest
0 голосов
/ 29 июня 2018

У меня есть объект, у которого есть несколько @ManyToOne связанных объектов. В настоящее время я смоделировал все связанные объекты выборки типа LAZY.

На самом деле я пишу REST API для поддержки различных функций, таких как

  1. Получите сущность с аннотацией @ManytoOne, которая будет преобразована в идентификатор
  2. Получить сущность с аннотацией @ManytoOne, разрешающей для всего объекта
  3. Получение сущности с аннотацией @ManytoOne, разрешающей частичный объект
  4. Извлечение сущностей с аннотацией @ManytoOne, преобразующейся в идентификатор

Мое приложение было построено с использованием репозитория Spring-boot jpa. Очевидно, что вышеуказанные изменения в REST API могут быть решены путем написания именованного запроса для каждого API. Если я сделаю это, в какой-то момент будет несколько именованных запросов для каждого связанного объекта. Но я ожидаю лучшего подхода к моделированию и опроса сущностей.

Любые предложения приветствуются.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

В вашем случае запросы, структура которых определена статически, действительно не подходят, так как вы действительно умножите количество запросов для записи / изменения / обслуживания.
JPA и Spring Data предоставляют альтернативы для создания гибких запросов и динамической настройки активной загрузки:

  • JPA 2 - Критерии : Сосредоточены на динамическом построении запросов и активном извлечении отношений.
    Он мощный, но для создания критериев требуется важная часть кода котельной плиты.

  • JPA 2.1 - Диаграмма сущностей : Сосредоточена на активном извлечении отношений.
    Этот акцент на страстно извлеченных из отношений.
    Это очень просто и не требует кода котельной плиты.
    Просто добавьте подсказку в Query/Criteria, который вы создаете.
    Может использоваться с запросами JPQL или критериями.

  • Spring Data - Технические характеристики : Ориентирован на динамическое построение запросов. Это оболочка / улучшитель критериев JPA с видением, управляемым доменом. Это мощный инструмент, но он также многословен в настройке.

  • Spring Data - Запрос по примеру : Сосредоточен на динамически создаваемых запросах. Это очень просто, дружелюбный клиент. У него есть некоторые ограничения, и я не думаю, что API должен быть разработан для установки режима выборки отношений запрашиваемой сущности.

Для вашего требования я бы ввел два метода репозитория.
Первый из них будет использовать Criteria + Entity Graph, чтобы извлечь выгоду из динамически создаваемых запросов и простой способ установить активное получение отношений для этих случаев:

Получить сущность с аннотацией @ManytoOne, преобразующейся в идентификатор

Получение сущности с аннотацией @ManytoOne, разрешающей для всего объекта

Получение сущности с аннотацией @ManytoOne, разрешающей частичный объект

И второй метод будет использовать Entity Graph + JPQL, чтобы извлечь выгоду только из нетерпеливого извлечения для этого:

Извлечение сущностей с аннотацией @ManytoOne, преобразующейся в идентификатор

С Criteria + Entity Graph вы могли бы получить единственный метод, который делает все, но иметь сложный метод, который делает много вещей, не обязательно лучший выбор.

0 голосов
/ 29 июня 2018

Насколько я понимаю, вы должны использовать Query by Example

API Query by Example состоит из трех частей:

  • Датчик: фактический пример объекта домена с заполненными полями.
  • ExampleMatcher: ExampleMatcher содержит подробную информацию о том, как сопоставлять определенные поля. Он может быть повторно использован для нескольких Examples.
  • Example: Example состоит из зонда и ExampleMatcher. Используется для создания запроса.

Запрос по примеру хорошо подходит для нескольких случаев использования:

  • Запрос к вашему хранилищу данных с набором статических или динамических ограничения.
  • Частый рефакторинг доменных объектов без беспокоиться о нарушении существующих запросов.
  • Работая независимо из базового API хранилища данных.

Запрос по примеру также имеет несколько ограничений:

  • Нет поддержки вложенных или сгруппированных ограничений свойств, таких как firstname = ?0 or (firstname = ?1 and lastname = ?2).
  • Поддерживает только начало / содержит / заканчивается / регулярное выражение для строк и точных соответствие для других типов собственности.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...