如何使用 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】:

您可以使用 JsonIdentityInfoJsonIdentityReference 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 调用中使用它

使用 Hibernate 和 JPA 持久化 JSON 对象

Spring boot jpa/hibernate 遇到列类型错误(json字段)