Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获取嵌套实体数据导致stackoverflow错误_Java_Spring Boot_Jpa_Jpql - Fatal编程技术网

Java 获取嵌套实体数据导致stackoverflow错误

Java 获取嵌套实体数据导致stackoverflow错误,java,spring-boot,jpa,jpql,Java,Spring Boot,Jpa,Jpql,我有一个多对多之间的关系2表用户和笑话。它们由一个连接表fav_连接,该表保存这些表中的id值。根据我设置它的方式,当我从这些表中插入和删除时,它似乎工作正常 问题是当我试图查询我的用户表以获取所有相关的笑话时。再次工作很好,但在某种初始形式中重复它,最终导致StackOverflow错误。请参阅此图以查看响应。正如你所看到的,我在笑话中找到了一个用户,这个用户有自己的笑话,这个笑话有自己的用户,而且它还在继续 当我进行此查询时,我只希望用户下有关联的笑话,在本例中应为2,仅此而已。我认为这与

我有一个多对多之间的关系2表用户和笑话。它们由一个连接表fav_连接,该表保存这些表中的id值。根据我设置它的方式,当我从这些表中插入和删除时,它似乎工作正常

问题是当我试图查询我的用户表以获取所有相关的笑话时。再次工作很好,但在某种初始形式中重复它,最终导致StackOverflow错误。请参阅此图以查看响应。正如你所看到的,我在笑话中找到了一个用户,这个用户有自己的笑话,这个笑话有自己的用户,而且它还在继续

当我进行此查询时,我只希望用户下有关联的笑话,在本例中应为2,仅此而已。我认为这与我在笑话实体中有@manytomy关系注释有关,但我相信我需要它。请给我一些建议。谢谢

实体

@Getter
@Setter
@NoArgsConstructor
@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    long memberId;

    @ManyToMany
    @JoinTable(
        name = "fav_joke",
        joinColumns = @JoinColumn(name = "memberId"),
        inverseJoinColumns = @JoinColumn(name = "id")
    )
    private Set<Joke> jokes;
}  

@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "joke")
public class Joke {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String question;
    private String answer;
    private boolean isFav;

    @ManyToMany(mappedBy = "jokes")
    private Set<User> users;
}
目前表内信息如下:(笑话表有1k+行)

更新

添加了注释中建议的@JsonIdentityInfoannotation。堆栈溢出问题现已消失,但信息附加的方式不正确

这是我得到的JSON格式

[{
    "id": 5,
    "question": "What is a gas station's favorite type of shoe?",
    "answer": "Pumps.",
    "users": [{
        "memberId": 1,
        "jokes": [5, {
            "id": 7,
            "question": "What kind of place should you never take a dog?",
            "answer": "To the Flea Market.",
            "users": [1],
            "fav": false
        }, {
            "id": 8,
            "question": "What do you call a cow in an earthquake?",
            "answer": "A milkshake!",
            "users": [1],
            "fav": false
        }, {
            "id": 6,
            "question": "Why was 6 afraid of 7?",
            "answer": "Because 7 8 9!",
            "users": [1],
            "fav": false
        }, {
            "id": 4,
            "question": "Why was Dracula put in jail?",
            "answer": "He tried to rob a blood bank.",
            "users": [1],
            "fav": false
        }]
    }],
    "fav": false
}, 7, 8, 6, 4]
奇怪的是,只有第一个笑话保持在最上面,其余的则一直被添加到用户列表中,如上面所述

我期待以下内容(并计划排除内部用户数据)


您可以使用
@JsonIgnoreProperties
打破循环:

public class Joke {

    @JsonIgnoreProperties("jokes")
    public Set<User> getUsers(){
        return this.users;
    }    
}  
公共课堂笑话{
@JsonIgnoreProperties(“笑话”)
公共集getUsers(){
将此文件返回给用户;
}    
}  
如果获得用户,同样的问题可能会发生,因此您可能还需要打破与用户之间的循环:

public class User {

    @JsonIgnoreProperties("users")
    public Set<Joke> getJokes(){
        return this.jokes;
    }    
}  
公共类用户{
@JsonIgnoreProperties(“用户”)
公众笑话{
把这个还给我;
}    
}  

您可以使用
@JsonIgnoreProperties
打破循环:

public class Joke {

    @JsonIgnoreProperties("jokes")
    public Set<User> getUsers(){
        return this.users;
    }    
}  
公共课堂笑话{
@JsonIgnoreProperties(“笑话”)
公共集getUsers(){
将此文件返回给用户;
}    
}  
如果获得用户,同样的问题可能会发生,因此您可能还需要打破与用户之间的循环:

public class User {

    @JsonIgnoreProperties("users")
    public Set<Joke> getJokes(){
        return this.jokes;
    }    
}  
公共类用户{
@JsonIgnoreProperties(“用户”)
公众笑话{
把这个还给我;
}    
}  

您可能正在查找
@JsonIdentityInfo
。实体通常应该被引用(包含在ID中),而不是嵌入到响应中。(根据REST约定,您的路径没有多大意义,但那是另一回事。)@chrylis我将尝试使用该注释。我知道这是离题的,但我能知道路径的问题吗?首先,它看起来像是“最喜欢的笑话”可能属于作为层次结构第一级的“成员”,所以它更像是
/members/{memberId}/..
。其次,“成为最受欢迎的人”是有无关系,因此我希望
/members/{memberId}/favorites
;用笑话ID
/members/{memberId}/favorites
发布一个请求以添加一个笑话,用
删除/members/{memberId}/favorites/{jokeId}
删除一个笑话。@chrylis感谢您的提示。这个注释很有效。没有stackoverflow错误,并且得到正确的响应。问题是,当我调试时,我仍然可以看到嵌套的结果。。这是一个问题,并导致我的资源出现问题..不。调试器只是正确地向您显示循环引用,除非您一直单击循环引用,否则这不是问题。您可能正在查找
@JsonIdentityInfo
。实体通常应该被引用(包含在ID中),而不是嵌入到响应中。(根据REST约定,您的路径没有多大意义,但那是另一回事。)@chrylis我将尝试使用该注释。我知道这是离题的,但我能知道路径的问题吗?首先,它看起来像是“最喜欢的笑话”可能属于作为层次结构第一级的“成员”,所以它更像是
/members/{memberId}/..
。其次,“成为最受欢迎的人”是有无关系,因此我希望
/members/{memberId}/favorites
;用笑话ID
/members/{memberId}/favorites
发布一个请求以添加一个笑话,用
删除/members/{memberId}/favorites/{jokeId}
删除一个笑话。@chrylis感谢您的提示。这个注释很有效。没有stackoverflow错误,并且得到正确的响应。问题是,当我调试时,我仍然可以看到嵌套的结果。。这是一个问题,并导致我的资源出现问题..不。调试器只是简单地向您正确显示循环引用,除非您一直单击循环引用,否则循环引用不是问题。通常最好使用
@JsonIdentityInfo
映射ID。通常最好使用
@JsonIdentityInfo
映射ID。
public class Joke {

    @JsonIgnoreProperties("jokes")
    public Set<User> getUsers(){
        return this.users;
    }    
}  
public class User {

    @JsonIgnoreProperties("users")
    public Set<Joke> getJokes(){
        return this.jokes;
    }    
}