我正在hibernate中使用ManyToOne和OneToMany,我想创建一个有位置的用户。 当我在邮递员中获得数据时,我有无限循环,因为当我获得user时,它显示用户的位置,而in location显示user等等。下面是代码:
位置类:
@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位置部分中只显示位置名称或ID?
问题
当您必须序列化具有双向关系的对象时,这是常见的问题。
解决方案
当面对双向关系时,向序列化器发出停止位置的信号
>
第一种方法是创建自定义DTO并从rest控制器返回它们。 在DTO中,您将使用LocationDTo
填充CustomerDTo
的Location
字段,但您不会设置LocationDTo
的Customer
字段,它将为NULL。
第二种方法较不可取。 但是我们可以告诉jackson库不要通过添加@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;
注意:
在生产系统中,我们不公开域对象的所有字段,因为它可能有许多内部字段,这些字段不应该向外部公开。 这就是原因,首选第一种方法