我有一个Province
类,如下所示:
public class Province {
@Id
Long id;
@Column(nullable = false)
String name;
@JsonManagedReference
@OneToMany(mappedBy = "province")
List<City> cities;
}
和City
类如下:
public class City{
@Column(nullable = false)
String name;
@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "province_id")
Province province;
}
现在我希望在REST结果中的City的JSON结果中有pronivce_id
(作为int值而不是对象)。
我该怎么做?
答案 0 :(得分:1)
您可以使用province_id
和JsonIdentityInfo
杰克逊注释返回JsonIdentityReference
。
public class City {
@Column(nullable = false)
String name;
@JsonProperty("province_id")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@JsonIdentityReference(alwaysAsId = true)
@ManyToOne
@JoinColumn(name = "province_id")
Province province;
}
此问题与Hibernate + JPA无关。您所需要的只是正确映射province
对象。但是你会遇到一些问题:
1)延迟加载问题。要映射所有省ID,您需要将它们加载到内存中。所以你不能使用fetch = LAZY
并且不正确的映射会导致N + 1抓取问题
2)此JSON映射将应用于序列化和去实现。因此,如果您要将此实体不仅用作Query POJO(用于JSON视图等),还用于Command对象(例如:用于创建和更新) - 您需要将省对象作为id
字段传递,而不是作为一个对象。