当前位置: 首页 > 知识库问答 >
问题:

Spring数据REST URI与实体ID

文华美
2023-03-14

Spring数据REST(尤其是Spring HATEOAS)将RESTful ID(即URI)与实体ID解耦,在保存新对象时,我很难将它们链接起来。有关此解耦的有趣讨论,请参见https://github.com/SpringSource/spring-data-rest/issues/13.

假设一个客户端应用程序想要创建一个新的票证资源和一个关联的票证类别资源。我想针对远程Spring数据RESTendpoint发布票据。这张票是新的,所以还没有ID。TicketCategory有一个ID,但在客户端上,根据上面的讨论,它是一个URI。因此,当我保存票证时,Spring Data REST将票证传递给Spring Data JPA,后者不喜欢它:Spring Data JPA认为没有实体ID的票证类别是暂时的:

org.hibernate.TransientPropertyValueException:
    Not-null property references a transient value -
    transient instance must be saved before current operation:
    com.springinpractice.ch13.helpdesk.model.Ticket.category ->
    com.springinpractice.ch13.helpdesk.model.TicketCategory

更新:文档位于

https://github.com/SpringSource/spring-data-rest/wiki/JPA-Repository-REST-Exporter

有一个名为“更新关系”的部分,描述了使用HTTP POST建立实体之间关系的方案。我不知道这是否是目前唯一可用的方法,但这种方法似乎需要在最初的帖子中保留空关联,然后用后续帖子更新它。在上述情况下,这是不可取的,因为票证需要类别字段(@NotNull)。


共有2个答案

江浩慨
2023-03-14

在较新版本的Spring Data Rest中,应该这样做:

POST /tickets
Content-Type: application/json

{
  "description": "Description of the ticket or issue",
  "category": "http://localhost:8080/categories/1"
}

根据OliverGierke在SpringDataREST2.0.0上的评论。释放中断先前使用RC1的代码

卢锋
2023-03-14

你看过吗https://github.com/SpringSource/spring-data-rest/wiki/Embedded-Entity-references-in-complex-object-graphs?

简而言之,如果导出器发现链接对象代替关系或托管对象(另一个具有导出存储库的实体),则导出器将取消引用链接对象。

假设您的链接属性称为“类别”,那么您可以创建一个新票证,如下所示:

POST /tickets
Content-Type: application/json

{
  "description": "Description of the ticket or issue",
  "category": {
    "rel": "category.Category",
    "href": "http://localhost:8080/categories/1"
  }
}
 类似资料:
  • 带有Hibernate的Spring数据JPA支持注释和。基于这些,实体类之间的继承映射到DB(单表/联接表https://stackoverflow.com/a/3579462/12053054)。 我找不到任何类似的机制来支持Spring data r2dbc的实体继承。我知道JPA和Hibernate的东西与r2dbc无关,但我认为在Spring data r2dbc存储库中支持继承没有任何

  • 我有一个问题,Spring数据没有保存实体。应用程序逻辑如下: 另一个应用程序正在监听负载相当重的Kafka主题(每秒数十条消息)并将消息插入数据库中具有“NEW”状态的表中。 @调度方法加载一个具有“NEW”状态的实体列表,这些实体被一个接一个地传输到FixedThreadPool(20个线程),它们的状态设置为“PROCESSING”和一个saveAll方法调用同一个表。 这两种日志方法都显示

  • 我想通过在父实体上调用保存来将父实体和子实体一起保存到MySQL数据库中。父实体和子实体之间有一对一的映射。父ID是自动生成的,我们需要在子实体中使用与子实体相同的pk。 我使用的是Spring数据JPA2.0(JPA提供程序是Hibernate)和Spring MVC框架。当尝试插入实体时,我遇到以下错误。 根本原因 这是我的数据库模式: 以下是我的Java实体父实体: 儿童性: 这是我的主要方

  • 我在Spring boot版本1.3.6中使用Spring Data JPA。 null 这将返回父实体,而不是子实体。 知道怎么做吗?

  • 图像我有以下实体:公司和员工,带有Spring数据neo4j注释: Company.java 受雇者JAVA 然后是这些实体的关系实体: 那么如何保留和中的引用呢? Company.java 或 人JAVA 或

  • 当应用程序基于Spring Boot时,不考虑定义的实体图。相反,在JUnit测试期间,一切正常。 领域非常简单:书籍及其类别(多对多关系) 图书类: 类别类: 带有使用创建的实体图的方法的JPA存储库: REST控制器中的用法: 启动Spring Boot(mvn Spring Boot:run)并导航到http://localhost:8080/books书籍会被显示,但它们有各自的类别(由于