在Spring Data Rest中,是否可以为相同的JPA实体发布两个不同的存储库?我将这两个存储库分别命名为不同的路径和关系名称,但只有其中一个作为REST端点可用。我之所以拥有两个存储库,是因为其中一个是摘录,仅显示实体的基本字段。
在Spring Data Rest中,是否可以为相同的JPA实体发布两个不同的存储库?我将这两个存储库分别命名为不同的路径和关系名称,但只有其中一个作为REST端点可用。我之所以拥有两个存储库,是因为其中一个是摘录,仅显示实体的基本字段。
糟糕的是,你每个实体只能有一个Spring Data Rest仓库(@RepositoryRestResource),而且如果你有一个常规的JPA @Repository(如CrudRepository或PagingAndSorting),它也将与Spring Data Rest进行交互(因为映射中的键是实体本身)。我浪费了不少时间来调试其中一个的随机加载。我想,如果这是Spring Data Rest的硬性限制,那么在尝试覆盖值时,如果映射的键已经存在,就应该抛出异常。
我最终使用了@Subselect
创建了第二个不可变实体,并将其绑定到第二个JpaRepository,并将其设置为@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函数,以便UI使用。另一个用于聚合后端报告组件,没有分页但具有排序功能。
我知道我可以在请求Pageable.unpaged()
之后从PagingAndSorting Repository中过滤结果,但我只想要一个基本的返回List
的JPA存储库,用于某些过滤器。
因此,这并没有直接回答问题,但可能有助于解决潜在的问题。
每个实体只能有一个存储库...但是,您可以在一个表中拥有多个实体;因此,在一个表中可以有多个存储库。
在我编写的一段代码中,我不得不创建两个实体...一个带有自动生成的ID,另一个带有预设的ID,但两者都指向同一张表:
@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> {
...
}
对于发布的问题,您可以有两个实体。一个是完整的实体,具有所有属性的getter和setter。另一个实体只有针对您想公开的字段的getter,但是有所有属性的setter。这有意义吗?
Map
,其中键是实体类。因此,实体只能同时映射到一个存储库接口(因为Map
一次只能保存一个键的值)。如果您的应用程序需要每个实体类有多个存储库,您可能需要向Spring Data团队提出增强请求。 - manishMultiMap
这样的结构,所以我建议您考虑向Spring Data团队提出增强请求。 - manish