异常解决 双向关联表查询时异常:java.lang.StackOverflowError: null

面试:你懂什么是分布式系统吗?Redis分布式锁都不会?>>>   hot3.png

错误内容:

Caused by: java.lang.StackOverflowError
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:737)
    ... 1011 more

一对多映射是这样配置的

//用户的所有优惠券集合
@ManyToMany(mappedBy = "users", fetch = FetchType.LAZY)
private List coupons = new ArrayList<>();

//一个优惠券有多个用户使用
@JoinTable(
	name = "hakj_user_user_coupon",
	joinColumns = {@JoinColumn(name = "c_id", referencedColumnName = "id")},
	inverseJoinColumns = {@JoinColumn(name = "u_id", referencedColumnName = "id")}
)
@ManyToMany(fetch = FetchType.LAZY)
private List users = new ArrayList<>();

原因:两个toString都会互相查,所以造成死循环
解决:改掉一个toString或两个都改掉,将toString中,改掉对对方的显示,例如上面的,toString中没有coupons

另一个方法( 不推荐):

for(Coupon coupon : user.getCoupons()){
        coupon.setUsers(null);//提前终止,这样便不会产生无限递归
        System.out.println(coupon);
}

你可能感兴趣的:(异常解决 双向关联表查询时异常:java.lang.StackOverflowError: null)