java - 我正在使用 ManyToOne , OneToMany 并且在获取数据时有无限循环

标签 java json hibernate

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

最佳答案

问题
当您必须序列化具有双向关系的对象时,这是一个通用问题。
解决方案
面对双向关系时,向串行器发出信号停止的位置

  • 第一种方法是创建自定义 DTO 并从您的休息 Controller 返回它们。在 DTO 中,您将填充 location领域customerDtolocationDto s 但你会 不是 设置 customer领域locationDto它将为空。
  • 第二种方法不太受欢迎。但是我们可以告诉 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;
    
    注:
    在生产系统中,我们不会暴露域对象的所有字段,因为它可以有许多不应暴露给外部的内部字段。这就是原因,首选第一种方法

    关于java - 我正在使用 ManyToOne , OneToMany 并且在获取数据时有无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62623483/

    相关文章:

    java - 将字符串值从一种方法发送到另一种方法

    javascript - 将 JSON 查询与 Nagios API 结合使用

    java - ORA-00932 : inconsistent datatypes: expected DATE got BINARY in Hibernate

    ios - 为什么 "data"不是字典

    json - 避免使用node.js在rest api中进行缓存

    java-hibernate 在运行时创建动态表

    java - 如何同时实现多父和多子映射?

    java - 如何在javafx2中获取变换后的形状的坐标?

    java - java 10-12 中的内存消耗比 java 8 更好?

    java - Powermock 的问题