gpt4 book ai didi

java - JPA/Hibernate 双向多对一导致 StackOverflowException

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:32:36 24 4
gpt4 key购买 nike

我有具有双向一对多关系的实体 User 和 GrantedRole。

当我尝试将 GrantedRole 添加到 User 中的 Set 时,没有抛出异常,但是当我调试 User 和 GrantedRole 对象的变量时,有一个描述

com.sun.jdi.InvocationException occurred invoking method.

变量的不同字段可以在调试时读取,但是当我选择 User 中的 roles 字段或 GrantedRole 中的 user 字段时,我得到与上面相同的描述。当我进入用户中的 GrantedRole 集合时,我最终找到了以下描述:

Detail formatter error: An exception occurred: java.lang.StackOverflowError

我的代码:

public class User {
private Set<GrantedRole> roles = new HashSet<GrantedRole>();

public User() {
super();
}
public User(String name, String password) {
this.name = name;
this.password = password;
}

@OneToMany(fetch = FetchType.EAGER, mappedBy = "user")
public Set<GrantedRole> getRoles() {
return roles;
}

public void setRoles(Set<GrantedRole> roles) {
this.roles = roles;
}

// equals and hashCode are based on username
// toString is based on all fields
}

public class GrantedRole {
private user user;

public GrantedRole() {
super();
}
public GrantedRole(User user, Role role, Organization organization) {
this.user = user;
this.role = role;
this.organization = organization;
}

@ManyToOne
@NotNull
public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}

// equals and hashCode are based on all fields
// toString was based on all fields, I've changed it to not include User.
}

public class Test {
public void testStuff() {
User user = new User("name");
GrantedRole role = new GrantedRole(user, "role"); //this sets the user field
user.getRoles().add(role); //doesn't throw Exception, but debugging shows InvocationTargetException and StackOverflowException
System.out.println(user.getRoles()); //throws StackOverflowException, as I would expect
}
}

据我了解,我应该能够以这种方式建立双向关系。我阅读了多个教程,like this one ,而且我看不出我在做什么导致 .add(role) 出错。

我遗漏了一些琐碎的代码,如果需要,我很乐意提供。我没有编写代码来确保该用户引用引用了用户的 GrantedRole 作为返回,但我认为这与我遇到的问题无关。

最佳答案

所以,我只是很愚蠢,在 toString() 方法中进行了递归调用。User.toString() 尝试打印角色,而 GrantedRole.toString() 尝试打印用户。

我通过更改 GrantedRole.toString() 来打印 user.getUsername() 来修复它,从而打破循环。

关于java - JPA/Hibernate 双向多对一导致 StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17195116/

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