Несколько репозиториев для одного и того же объекта в 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> {

    ...

}

Для опубликованной проблемы у вас могут быть два объекта. Один из них был бы полным, с геттерами и сеттерами для всего. Другой, был бы сущностью, где есть сеттеры для всего, но только геттеры для полей, которые вы хотите обнародовать. Это имеет смысл?