【问题标题】:How to include join column in json result with JPA+Hibernate如何使用 JPA+Hibernate 在 json 结果中包含连接列
【发布时间】: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 设置器。

标签: java spring jpa jackson hibernate-onetomany


【解决方案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 字段传递,而不是作为目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2017-01-29
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2015-06-15
    相关资源
    最近更新 更多