java栈tostring_java – 重写toString()方法的StackOverflow错误

我有两个班级User&角色.他们有很多关系.

在User类中,我重写了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 + "]";

}

在Role类中相同

@Override

public String toString() {

return "Role [roleId=" + roleId + ", users=" + users + ", role=" + role

+ "]";

}

我通过hibernate从db获取用户详细信息

@SuppressWarnings("unchecked")

public User getUser(String name){

List userList = new ArrayList();

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;

}

当流程在hibernate方法中到达下面的行时

userList = query.list();

它抛出一个堆栈溢出异常,显示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.(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)

下面一行的位置是User类中toString方法的开头

at com.myapp.model.User.toString(User.java:189)

解决方法:

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

所以会发生的是在角色上调用toString(),然后尝试在所有用户上调用toString().但它将从user-1开始,它有一个返回角色的引用,并且该过程重新开始.你基本上有一个无限递归的情况.

标签:java,hibernate

来源: https://codeday.me/bug/20190722/1504567.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值