【问题标题】:How to reference an entity by id in a request如何在请求中通过 id 引用实体
【发布时间】:2019-09-16 07:51:03
【问题描述】:

我正在设置一个 Spring Boot 应用程序,我已经设置了实体并连接到一个数据库,现在我想实现从其余 API 保存数据。假设我有这样的实体

@Entity
class A {
   ...
   private String name;
   @OneToOne
   private B b; 
   ...
} 

并且我希望能够在 ID 为 1 的 B 存在时发送此帖子“A”创建请求。此请求的结果是 A 链接到 B。

{
   "name":"name Of A"
   "B": {
      "id":1
   }
}

这是否可以通过 Spring Boot 提供的工具实现,或者这不是传统的做事方式。提前致谢。

【问题讨论】:

  • 我不明白你的问题,实际上如果你只是从@RestController 返回你的实体A,它会正确地解析为 JSON 作为你的例子,你有什么问题吗?
  • 我发送给定的有效载荷并尝试保存实体。 Hibernate 表示给定实体已分离,无法保存
  • 发生这种情况是因为在序列化之后您在 Hibernate 的上下文中确实没有 A 或 B,您应该找到 madz 提到的引用或获取数据库中的整个实体。我不建议你直接使用数据库实体进行序列化,你应该使用 DTO 来代替

标签: java spring spring-boot spring-data-jpa spring-data


【解决方案1】:

据我所知,没有任何内置解决方案可以简单地将 json 映射到要由存储库直接保存的实体。

你需要在rest控制器中使用@RequestBody作为A参数,然后手动使用entityManager.getReference(id_of_b)设置A的B实体。然后你可以使用repository.save ...

如果你想让它变得更好,你需要编写自己的HandlerMethodArgumentResolver并实现并注册JacksonStdDesrializer以确定@OneToOne@ManyToOne关系,然后通过Jackson获取关系的id并如上所述通过entityManager.getReference(id_of_b) 设置它。

这样生成的实体就可以直接被存储库保存了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    相关资源
    最近更新 更多