我有一个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_idJsonIdentityInfo 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/

10-09 05:40