提问者:小点点

我正在使用ManyToOne,OneToMane,并且在获取数据时有无尽的循环


我正在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?


共1个答案

匿名用户

问题

当您必须序列化具有双向关系的对象时,这是常见的问题。

解决方案

当面对双向关系时,向序列化器发出停止位置的信号

>

  • 第一种方法是创建自定义DTO并从rest控制器返回它们。 在DTO中,您将使用LocationDTo填充CustomerDToLocation字段,但您不会设置LocationDToCustomer字段,它将为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;
    

    注意:

    在生产系统中,我们不公开域对象的所有字段,因为它可能有许多内部字段,这些字段不应该向外部公开。 这就是原因,首选第一种方法