如何在JPA + Hibernate的json结果中包含join列

时间:2018-04-14 15:09:52

标签: java spring jpa jackson hibernate-onetomany

我有一个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值而不是对象)。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以使用province_idJsonIdentityInfo杰克逊注释返回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字段传递,而不是作为一个对象。