Java 如何使用JPA+Hibernate在json结果中包含连接列

Java 如何使用JPA+Hibernate在json结果中包含连接列,java,spring,jpa,jackson,hibernate-onetomany,Java,Spring,Jpa,Jackson,Hibernate Onetomany,我的省级课程如下: public class Province { @Id Long id; @Column(nullable = false) String name; @JsonManagedReference @OneToMany(mappedBy = "province") List<City> cities; } public class City{ @Column(nullable = false)

我的省级课程如下:

public class Province {

    @Id
    Long id;

    @Column(nullable = false)
    String name;

    @JsonManagedReference
    @OneToMany(mappedBy = "province")
    List<City> cities;

}
public class City{
    @Column(nullable = false)
    String name;

    @JsonBackReference
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "province_id")
    Province province;

}
现在我想让pronivce_id作为int值,而不是REST结果中City的JSON结果中的object

如何执行此操作?

您可以使用JsonIdentityInfo和JsonIdentityReference注释返回省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无关。您所需要的只是正确地映射省对象。但您将面临一些问题: 1延迟加载问题。要映射所有省ID,需要将它们加载到内存中。因此,您不能使用fetch=LAZY,如果映射不正确,将导致N+1获取问题。
2此JSON映射将应用于序列化和反序列化。因此,如果您不仅要将此实体用作JSON视图等的查询POJO,还要用作命令对象(例如:用于创建和更新),那么您需要将省对象作为id字段传递,而不是作为对象传递

现在的方法很好,我想更好的方法是显式地选择一个省id,并将其设置为您想要返回的特定对象getter setter。也给我们一个服务层,这样我们就可以看到您是如何返回的。JSON与JPA无关,所以请定义您的问题所在。。。在执行查询和检索对象JPA时,或者在将对象转换为JSON?@parladneupane时,没有任何服务层,因为我使用的是Spring boot。我只返回从JPARepository扩展而来的cityRepo.findAll,在REST API的结果中,我没有省\号。@JsonBackReference@ManyToOnefetch=FetchType.LAZY@JoinColumnname=province\号province;将始终为您提供省对象,因此如果您需要具有省id的城市,则需要在城市类中具有省id的getter setter。