gpt4 book ai didi

java - 同一实体类型的双向多对多N+1查询

转载 作者:行者123 更新时间:2023-12-02 02:20:37 26 4
gpt4 key购买 nike

我有一个实体,如下所示。我想从数据库中获取一个实体,其中包含她/他的所有 friend 及其原始类型字段(id、name)。在这个例子中,它试图返回所有 friend 和 friend 的 friend ,因此它创建了一个无限循环。我只想获得具有原始字段的第一级好友对象。这看起来像是一个 N+1 查询问题,但我找不到解决方案。有没有任何解决方案可以停止这种无限递归并返回我提到的响应?

@Builder
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "PERSON")
@ToString(exclude = "friends")
@EqualsAndHashCode(exclude = "friends")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;

@Column(name = "name",unique = true)
private String name;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "FRIENDSHIP",
joinColumns = @JoinColumn(name = "person_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "friend_id", referencedColumnName = "id"))
private Set<Person> friends;

我正在创建如下双向友谊:

public Person makeFriendship(String personName, String friendName) 
throws FriendshipExistsException, PersonNotFoundException {
Person person = retrieveWithName(personName);
Person friend = retrieveWithName(friendName);
if(!person.getFriends().contains(friend)){
person.getFriends().add(friend);
friend.getFriends().add(person);
return repository.save(person);
} else {
throw new FriendshipExistsException(personName, friendName);
}

出现以下错误:

Could not write JSON: Infinite recursion (StackOverflowError);

但我认为根本原因是 N+1 查询,但 @EntityGraph@JsonBackReference 都没有成为我的案例的解决方案。我不确定如何为相同类型的实体关系实现它们。

PS: I have a premise question about same code: Many to many relationship for same type entity

最佳答案

尝试使用:

@JsonIgnoreProperties("friends")
private Set<Person> friends;

它应该阻止 friend 在递归中显示他们的 friend

关于java - 同一实体类型的双向多对多N+1查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48562273/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com