从循环引用到hibernate的游离化

问题描述:

列表页面,50多条数据只显示3条,其他的也显示出来了,不过全部都是空白,差点哭晕在厕所

然后debug断点进去看,发现好多的json数据长这个样子的


"dept":{"$ref":"$[0].dept"

(这里给的是类似这样的字符串)


"$ref":"$"} 引用根对象

{"$ref":"@"} 引用自己

{"$ref":".."} 引用父对象

{"$ref":"../.."} 引用父对象的父对象

{"$ref":"$.members[0].reportTo"} 基于路径的引用

查着就发现了循环引用的新名词

附上一个详细链接  循环引用

即使用的是fastjson,在list转json的时候出现了循环引用。

我尝试关闭的时候报了这样的错

WARN:  Nested in org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.StackOverflowError:
java.lang.StackOverflowError
at java.util.LinkedHashMap$KeyIterator.<init>(LinkedHashMap.java:404)
at java.util.LinkedHashMap.newKeyIterator(LinkedHashMap.java:417)
at java.util.HashMap$KeySet.iterator(HashMap.java:1002)
at java.util.HashSet.iterator(HashSet.java:170)
at org.hibernate.collection.PersistentSet.iterator(PersistentSet.java:187)
at com.alibaba.fastjson.serializer.CollectionSerializer.write(CollectionSerializer.java:68)
at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:390)
at Serializer_2.write1(Unknown Source)
at Serializer_2.write(Unknown Source)
at com.alibaba.fastjson.serializer.JSONSerializer.writeWithFieldName(JSONSerializer.java:390)
at Serializer_1.write1(Unknown Source)
at Serializer_1.write(Unknown Source)

看着也是呵呵了,没有走这条路,因为顺着这条路解决也是没有从根本上解决问题的。

问了其他人,冒出了个游离化(具体本文不做详述)

这个是我之前写的:

public List<T> loadAll() {   
     return getHibernateTemplate().loadAll(entityClass);
}

直接给出我游离化后的代码:

public List<T> loadAll() {
    List<T> list=getHibernateTemplate().loadAll(entityClass);
    for (T t:list ){ 
        getHibernateTemplate().evict(t);
    }   
     return list;
}

问题就这么愉快的解决了,在此记录下,希望对遇到同类问题的同学有所帮助。


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。