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