【问题标题】:Retrieve data from @ManyToMany bidirectional relationship从@ManyToMany 双向关系中检索数据
【发布时间】:2019-02-20 12:39:39
【问题描述】:

我正在努力找出如何在春季从@ManyToMany 关系中检索数据。我遇到了无限递归问题并尝试了一些解决方案,例如使用@JsonIgnoreProperties,但无济于事。

一个用户可以有很多组,一个组可以有很多用户。我可以将用户添加到组中,但是在检索与用户关联的所有组时,我会从无限递归中得到堆栈溢出。

我的 GroupAccount 类:

@Entity
public class GroupAccount {

//Private variables omitted for brevity

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "groupAccount_users",
                joinColumns = {@JoinColumn(name = "groupAccount_id")},
                inverseJoinColumns = {@JoinColumn(name = "user_id")})
private List<User> groupMembers = new ArrayList<>();

//Constructors, most getters, setters omitted for brevity

public void addUserToGroupParticipants(User user){
    groupMembers.add(user);
    incrementGroupMembers();
}

public void incrementGroupMembers() {
    numberOfMembers++;
}

public List<User> getGroupMembers(){
    return groupMembers;
}
}

我的用户类:

@Entity
public class User {

//Private variables omitted for brevity

@ManyToMany(mappedBy="groupMembers",
                        fetch = FetchType.LAZY)
private List<GroupAccount> groupAccounts = new ArrayList<>();

//Constructors, most getters, setters omitted for brevity

public List<GroupAccount> getUsersAccounts() {
    return groupAccounts;
}
}

理想情况下,我希望能够使用用户 ID 发送获取请求,然后检索与该用户关联的所有 GroupAccount 对象。稍后,我将希望能够查看与特定 GroupAccount 关联的所有用户

【问题讨论】:

    标签: java json spring spring-boot


    【解决方案1】:

    您应该在groupMembers 上使用@JsonIgnore 注释以避免陷入无限递归。

    @ManyToMany(fetch = FetchType.LAZY)
    @JsonIgnore
    @JoinTable(name = "groupAccount_users",
                    joinColumns = {@JoinColumn(name = "groupAccount_id")},
                    inverseJoinColumns = {@JoinColumn(name = "user_id")})
    private List<User> groupMembers = new ArrayList<>();
    

    【讨论】:

    • 你能解释一下它是如何工作的吗?此外,如果我将 @JsonIgnore 置于该关系之上,是否会阻止我进一步获取与特定组关联的所有组成员?
    • 此注解可防止在让 Json 作为响应时再次包含 groupMember 的用户 Json 格式,而您的第二个问题的答案是肯定会停止
    • 好吧,如果它会妨碍我获得群组成员的能力,我不能使用它
    • 您可以获取群组成员并在您的服务层返回
    【解决方案2】:

    您必须重写 User 类中的“toString”方法,对该值的评估会导致堆栈溢出异常。您可以非常轻松地对其进行调试和检查。

    【讨论】:

    • 您是否排除了“groupAccounts”?
    • 什么意思?我在两个类中都覆盖了 toString。这就是我所做的一切
    • 所以你在 toString 方法中导致无限循环,因为“GroupAccount”有用户,“User”有组帐户,你必须在两个类中重写 toString,不包括这个 relashionships。所以“GroupAccount”的toString方法不能包含“groupMembers”字段,“User”类的toString方法不能包含“groupAccounts”字段。这个帖子有更详细的答案stackoverflow.com/questions/25938331/…
    • Okei,你能发布 stacktrace 吗?
    • 我刚刚将其更改为单向关系并使其正常工作。这并不理想,但可以正常工作
    猜你喜欢
    • 2016-12-05
    • 1970-01-01
    • 2013-06-21
    • 2019-04-11
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多