我在 hibernate 中使用 ManyToOne 和 OneToMany。我想创建一个拥有位置的用户。
当我在 postman 中获取数据时,我会无限循环,因为当我获取用户时,它会显示用户的位置,并在位置中显示用户等等。这是代码:
位置类:
@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name=FLD_LOC, nullable=false)
private Consumer consumers;
public Consumption(String location, float consumpiton,Consumer consumer) {
this.location = location;
this.consumpiton = consumpiton;
this.consumers=consumer;
}
用户类:@OneToMany(mappedBy = Consumption.FLD_LOC,orphanRemoval = true)
private List<Consumption> locations ;
public Consumer(String clientId, String name,String location, float pwConsumption, String email, String password, String roles) {
super(clientId, name, email, password, roles);
this.locations=new ArrayList<>();
this.location=location;
this.pwcons=pwConsumption;
}
但是在数据库中,它在用户表中存储位置名称,在位置表中存储用户 ID这是问题看起来像:
"id": 2,
"version": 1,
"updated": "2020-06-28T15:41:49.082",
"clientId": "admin",
"name": "admin",
"email": "admin123@gmail.com",
"password": "$2a$10$hgcTSHjGpxEPg6WNb0U7ouHR5J5YYR5l1XVAejdK8JsG9w2Bko00a",
"active": true,
"roles": "ROLE_ADMIN",
"locations": [
{
"locationsid": 1,
"location": "Pecs",
"consumpiton": 0.0,
"consumers": {
"id": 2,
"version": 1,
"updated": "2020-06-28T15:41:49.082",
"clientId": "admin",
"name": "admin",
"email": "admin123@gmail.com",
"password": "$2a$10$hgcTSHjGpxEPg6WNb0U7ouHR5J5YYR5l1XVAejdK8JsG9w2Bko00a",
"active": true,
"roles": "ROLE_ADMIN",
"locations": [
{
"locationsid": 1,
"location": "Pecs",
"consumpiton": 0.0,
"consumers": {
"id": 2,
"version": 1,
"updated": "2020-06-28T15:41:49.082",
"clientId": "admin",
"name": "admin",
"email": "admin123@gmail.com",
"password": "$2a$10$hgcTSHjGpxEPg6WNb0U7ouHR5J5YYR5l1XVAejdK8JsG9w2Bko00a",
"active": true,
"roles": "ROLE_ADMIN",
"locations": [
{
"locationsid": 1,
"location": "Pecs",
如何让它在 JSON Locations 部分中仅显示位置名称或 ID?
最佳答案
问题
当您必须序列化具有双向关系的对象时,这是一个通用问题。
解决方案
面对双向关系时,向串行器发出信号停止的位置
location
领域customerDto
与 locationDto
s 但你会 不是 设置 customer
领域locationDto
它将为空。@JsonManagedReference
来递归地序列化它。和 @JsonBackReference
. @OneToMany(mappedBy = Consumption.FLD_LOC,orphanRemoval = true)
private List<Consumption> locations ;
with
@OneToMany(mappedBy = Consumption.FLD_LOC,orphanRemoval = true)
@JsonManagedReference
private List<Consumption> locations ;
@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name=FLD_LOC, nullable=false)
private Consumer consumers;
with
@ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name=FLD_LOC, nullable=false)
@JsonBackReference
private Consumer consumers;
注:在生产系统中,我们不会暴露域对象的所有字段,因为它可以有许多不应暴露给外部的内部字段。这就是原因,首选第一种方法
关于java - 我正在使用 ManyToOne , OneToMany 并且在获取数据时有无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62623483/