Несколько репозиториев для одного и того же объекта в Spring Data Rest
Возможно ли опубликовать два разных репозитория для одного и того же объекта JPA с Spring Data Rest?
Я дал двум репозиториям разные пути и rel-имена, но только один из них доступен как конечная точка REST.
То, почему у меня есть два репозитория, состоит в том, что один из них - выдержка, показывающая только основные поля объекта.
Ответы
Ответ 1
Ужасная часть заключается не только в том, что вы можете иметь только 1 spring репозиторий для хранения данных (@RepositoryRestResource) на Entity, но также, если у вас есть обычный JPA @Repository (например, CrudRepository или PagingAndSorting ) он также будет взаимодействовать с остатком данных spring one (так как ключ на карте - это сам Entity).
Потеряли довольно много часов, отлаживая случайную нагрузку того или другого. Я думаю, что если это жесткое ограничение spring остатка данных, по крайней мере, исключение может быть вызвано, если ключ карты уже существует при попытке переопределить значение.
Ответ 2
Ответ выглядит следующим образом: для объекта существует только один репозиторий.
Ответ 3
В итоге я использовал @Subselect
для создания второй неизменной сущности и связал ее со вторым JpaRepsotory и установил ее на @RestResource(exported = false)
, что также способствует разделению интересов.
Пример сотрудника
@Entity
@Table(name = "employee")
public class Employee {
@Id
Long id
String name
...
}
@RestResource
public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Long> {
}
@Entity
@Immutable
@Subselect(value = 'select id, name, salary from employee')
public class VEmployeeSummary {
@Id
Long id
...
}
@RestResource(exported = false)
public interface VEmployeeRepository extends JpaRepository<VEmployeeSummary, Long> {
}
контекст
Два пакета в монолитном приложении имели разные требования. Необходимо было представить объекты для пользовательского интерфейса в PagingAndSortingRepository
, включая функции CRUD. Другой был для агрегирующего внутреннего компонента отчета без разбивки на страницы, но с сортировкой.
Я знаю, что мог бы отфильтровать результаты из репозитория PagingAndSorting после запроса Pageable.unpaged()
, но я просто хотел базовый репозиторий JPA, который возвращал List
для некоторых фильтров.
Ответ 4
Итак, это напрямую не отвечает на вопрос, но может помочь решить основную проблему.
У вас может быть только один репозиторий на сущность... однако вы можете иметь несколько объектов в таблице; таким образом, имея несколько репозиториев в таблице.
В некотором коде, который я написал, мне пришлось создать два объекта... один с автогенерированным идентификатором, а другой с предустановленным идентификатором, но оба они указывали на одну и ту же таблицу:
@Entity
@Table("line_item")
public class LineItemWithAutoId {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
...
}
@Entity
@Table("line_item")
public class LineItemWithPredefinedId {
@Id
private String id;
...
}
Затем у меня был репозиторий для каждого:
public interface LineItemWithoutId extends Repository<LineItemWithAutoId,String> {
...
}
public interface LineItemWithId extends Repository<LineItemWithPredefinedId,String> {
...
}
Для опубликованной проблемы у вас могут быть два объекта. Один из них был бы полным, с геттерами и сеттерами для всего. Другой, был бы сущностью, где есть сеттеры для всего, но только геттеры для полей, которые вы хотите обнародовать. Это имеет смысл?