Spring boot JPA - 没有嵌套对象的 JSON 与 OneToMany 关系

Posted

技术标签:

【中文标题】Spring boot JPA - 没有嵌套对象的 JSON 与 OneToMany 关系【英文标题】:Spring boot JPA - JSON without nested object with OneToMany relation 【发布时间】:2016-02-02 04:40:40 【问题描述】:

我有一个项目处理一些对象的 ORM 映射(有一些 @OneToMany 关系等)。

我使用 REST 接口来处理这些对象,并使用 Spring JPA 在 API 中管理它们。

这是我的一个 POJO 的示例:

@Entity
public class Flight 

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private long id;
  private String name;
  private String dateOfDeparture;
  private double distance;
  private double price;
  private int seats;

  @ManyToOne(fetch = FetchType.EAGER)
  private Destination fromDestination;

  @ManyToOne(fetch = FetchType.EAGER)
  private Destination toDestination;

  @OneToMany(fetch = FetchType.EAGER, mappedBy = "flight")
  private List<Reservation> reservations;

发出请求时,我必须在 JSON 中指定所有内容:


  "id": 0,
  "reservations": [
    
  ],
  "name": "string",
  "dateOfDeparture": "string",
  "distance": 0,
  "price": 0,
  "seats": 0,
  "from": 
    "id": 0,
    "name": "string"
  ,
  "to": 
    "id": 0,
    "name": "string"
  

我更喜欢的是,实际上是指定引用对象的 id 而不是它们的整个主体,如下所示:


  "id": 0,
  "reservations": [
    
  ],
  "name": "string",
  "dateOfDeparture": "string",
  "distance": 0,
  "price": 0,
  "seats": 0,
  "from": 1,
  "to": 2

这可能吗?有人能给我一些关于如何做到这一点的见解吗?我只是在寻找关于如何做相反的教程(我已经拥有的解决方案)。

【问题讨论】:

你可以试试发现这个有用 - wiki.fasterxml.com/JacksonFeatureObjectIdentity 【参考方案1】:

是的,这是可能的。

为此,您应该对实体模型使用一对 Jackson 注释:

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonIdentityReference(alwaysAsId = true)
protected Location from;  

您的序列化 JSON 将显示为:


    "from": 
        "id": 3,
        "description": "New-York"
     

像这样:


    "from": 3

如official documentation中所述:

@JsonIdentityReference - 可选注解,可用于 自定义对“对象”的对象的引用的详细信息 身份”已启用(请参阅JsonIdentityInfo)

alwaysAsId = true用作标记,表示是否全部引用 值将被序列化为 ids (true);

注意如果使用 'true' 的值,反序列化可能需要额外的上下文信息,并且可能使用自定义 id 解析器 - 默认处理可能不够。

【讨论】:

这里需要@JsonIdentityInfo 吗?【参考方案2】:

您只能使用 @JsonIgnore 注释忽略您的 JSON 内容。 你想在你的 JSON 中隐藏的字段,你可以用 @JsonIgnore 对其进行注释。 您可以像这样更改 JSON:


    "id": 0,
    "reservations": [
        
    ],
    "name": "string",
    "dateOfDeparture": "string",
    "distance": 0,
    "price": 0,
    "seats": 0,
    "from": 
        "id": 0
    ,
    "to": 
        "id": 0
    

但你不能这样:


    "id": 0,
    "reservations": [
        
    ],
    "name": "string",
    "dateOfDeparture": "string",
    "distance": 0,
    "price": 0,
    "seats": 0,
    "from": 0,
    "to": 1

【讨论】:

我认为第二部分不正确,如另一个答案所示。 我同意@Amit khanduri 如果一个请求需要嵌套数据而其他请求不需要,则此方法不起作用。假设我有一家商店和一件商品。我想要一个我拥有的项目名称,并且我想用几个商店详细信息来检索它。你知道在 Spring Boot 中这样做的方法吗?

以上是关于Spring boot JPA - 没有嵌套对象的 JSON 与 OneToMany 关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中将嵌套的 JSON 对象映射为 SQL 表行

Spring boot之 JPA/Hibernate/Spring Data

Spring JPA 更新不适用于嵌套对象

Spring Boot-------JPA基础及查询规则

在为嵌套对象创建自定义 Spring Data JPA 查询时获取 IllegalArgumentException

没有 Spring Boot 的 Spring Data JPA