如何使用 JPA+Hibernate 在 json 结果中包含连接列
Posted
技术标签:
【中文标题】如何使用 JPA+Hibernate 在 json 结果中包含连接列【英文标题】:How to include join column in json result with JPA+Hibernate 【发布时间】:2018-04-14 15:09:51 【问题描述】:我有一个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 值而不是对象)。
我该怎么做?
【问题讨论】:
现在的方式很好,我想更好的方法是明确选择一个省 ID 并将其设置为您想要返回的特定对象 getter setter。也给我们一个服务层,这样我们就可以看到你是如何返回的。 JSON 与 JPA 无关,因此请定义您的问题出在哪里……在执行查询和检索对象 (JPA) 或将对象转换为 JSON 时? @parladneupane 没有任何服务层,因为我使用的是 Spring Boot。我只返回从JPARepository
扩展的cityRepo.findAll()
,在我的REST API 的结果中我没有province_id
。
@JsonBackReference @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "province_id") Province province;
将始终为您提供省对象,因此如果您需要具有省 ID 的市,则需要在市类中具有省 ID 的 getter 设置器。
【参考方案1】:
您可以使用 JsonIdentityInfo
和 JsonIdentityReference
Jackson 注释返回 province_id
。
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 映射将适用于序列化和解散。因此,如果您不仅要将此实体用作查询 POJO(用于 JSON 视图等),还用于命令对象(例如:用于创建和更新) - 您需要将省份对象作为 id
字段传递,而不是作为目的。
【讨论】:
以上是关于如何使用 JPA+Hibernate 在 json 结果中包含连接列的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot 中使用 Hibernate/JPA 返回多级 json
如何使用 JPA 和 Hibernate 将 MySQL JSON 列映射到 Java 实体属性
如何使用 JPA 和 Hibernate 自动序列化和反序列化 JSON 字符串?
如何强制初始化 Hibernate JPA 代理以在 JSON 调用中使用它