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。