Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/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 重写toString()方法时发生StackOverflow错误_Java_Hibernate - Fatal编程技术网

Java 重写toString()方法时发生StackOverflow错误

Java 重写toString()方法时发生StackOverflow错误,java,hibernate,Java,Hibernate,我有两个类:用户和角色。他们有一种多对多的关系 在用户类中,我重写了toString方法 @Override public String toString() { return "User [userId=" + this.userId + ", profileName=" + this.profileName + ", firstName=" + this.firstName + ", lastName=" + this.lastName

我有两个类:用户和角色。他们有一种多对多的关系

在用户类中,我重写了toString方法

@Override
    public String toString() {
        return "User [userId=" + this.userId + ", profileName=" + this.profileName
                + ", firstName=" + this.firstName + ", lastName=" + this.lastName
                + ", email=" + this.email + ", socialEmail=" + this.socialEmail
                + ", accountEnabled=" + this.accountEnabled + ", accountNonExpired="
                + this.accountNonExpired + ", accountNonLocked=" + this.accountNonLocked
                + ", country=" + this.country + ", role=" + this.role + "]";
    }
在角色类中相同

@Override
public String toString() {
    return "Role [roleId=" + roleId + ", users=" + users + ", role=" + role
            + "]";
}
我正在通过hibernate从数据库中获取用户详细信息

@SuppressWarnings("unchecked")
    public User getUser(String name){

        List<User> userList = new ArrayList<User>(); 
        Query query = sessionFactory.getCurrentSession().createQuery("from User u where u.profileName = :name or u.socialEmail = :name");
        query.setParameter("name", name);
        userList = query.list();  
        if (userList.size() > 0)  
            return userList.get(0);  
        else  
            return null; 
    }
它抛出堆栈溢出异常,显示toString是原因 有人能帮我吗

java.lang.StackOverflowError
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:113)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:415)
    at java.lang.StringBuilder.append(StringBuilder.java:132)
    at java.lang.StringBuilder.<init>(StringBuilder.java:110)
    at com.myapp.model.User.toString(User.java:189)
    at java.lang.String.valueOf(String.java:2902)
    at java.lang.StringBuilder.append(StringBuilder.java:128)
    at java.util.AbstractCollection.toString(AbstractCollection.java:450)
    at org.hibernate.collection.PersistentSet.toString(PersistentSet.java:310)
    at java.lang.String.valueOf(String.java:2902)
    at java.lang.StringBuilder.append(StringBuilder.java:128)
    at com.myapp.model.Role.toString(Role.java:67)

在用户的
toString()
中引用
角色
,在角色的
toString()
中引用
用户
。现在,如果每个角色都有一个用户列表,并且每个用户实例都有一个对父角色的引用,那么您就有了循环引用。基本上,对象图如下所示:


因此,所发生的情况是在
角色上调用
toString()
,然后尝试在所有用户上调用
toString()
。但是它将从
user-1
开始,它引用了
role
,然后这个过程将重新开始。本质上是无限递归。

为什么
用户
角色
的字段?即使是这样,它也不应该出现在
toString()
方法中,因为最终会出现无限递归:
User.toString()
调用
Role.toString()
,然后反过来调用。我们如何克服这一问题?我们需要修改toString代码吗?
java.lang.StackOverflowError
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:113)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:415)
    at java.lang.StringBuilder.append(StringBuilder.java:132)
    at java.lang.StringBuilder.<init>(StringBuilder.java:110)
    at com.myapp.model.User.toString(User.java:189)
    at java.lang.String.valueOf(String.java:2902)
    at java.lang.StringBuilder.append(StringBuilder.java:128)
    at java.util.AbstractCollection.toString(AbstractCollection.java:450)
    at org.hibernate.collection.PersistentSet.toString(PersistentSet.java:310)
    at java.lang.String.valueOf(String.java:2902)
    at java.lang.StringBuilder.append(StringBuilder.java:128)
    at com.myapp.model.Role.toString(Role.java:67)
at com.myapp.model.User.toString(User.java:189)