我有一个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值而不是对象)。我怎样才能做到这一点?
最佳答案
您可以返回带有province_id
和JsonIdentityInfo
Jackson批注的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对象(例如:用于创建和更新),则需要将Province对象作为
id
字段传递,而不是作为宾语。关于java - 如何使用JPA + Hibernate在JSON结果中包括连接列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49832919/