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