|
阅读:14489回复:3
JSON+Hibernate死循环问题的解决办法
在我们使用hibernate框架而又需要将对象转换为json的时候,如果配置了双向的关联关系,就会出现死循环问题
【原因】原因在于你要转化的对象里配置了对另外一个对象的关联,而那个对象里又配置了对你这个对象的关联。比如我的两个类叫做Shop(商店)和Staff(员工),一个商店可以有多个员工,所以我给这两个对象配置了双向的一对多和多对一的关联关系。这时候问题就出现了,JSON lib在把shop对象转化为json字符串的时候,发现shop里有个Set,它就会去级联的把Set转化为json字符串,在它遍历Set的时候,发现Staff里又有一个Shop对象,这时候它又会去尝试把shop转化为json字符串,然后就发现shop里又有Set,如此周而复始,就形成了死循环。 【解决】JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setIgnoreDefaultExcludes(false); //设置默认忽略 jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);//设置循环策略为忽略 解决json最头疼的问题 死循环 jsonConfig.setExcludes(new String[] {"staffs"});//此处是亮点,只要将所需忽略字段加到数组中即可 按照上面的配置,并没有完全ok,在测试的时候发现了一个更严重的问题,获取shop的时候,生成的json字符串里staffs的Set不见了,获取staffs的时候,他的属性shop也不见了。就是说这样完成过滤后,配置的双向关联的关系就没有了任何意义,ajax在页面取值也不能关联取值,为此,又在网上找到了一段代码 JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setIgnoreDefaultExcludes(false); jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT); config.setExcludes(new String[]{"handler","hibernateLazyInitializer"}); jsonConfig.setExcludes(new String[] {"staffs"}); 加了这段代码后ajax成功取到了关联对象中的值,然而这句代码的内部是怎样实现的我还是没搞懂,哪位大神知道的可以在评论中讨论一下,嘻嘻... |
|
|
沙发#
发布于:2016-08-30 14:10
|
|
|
板凳#
发布于:2016-08-18 23:47
|
|
|
地板#
发布于:2016-08-17 09:29
SetExcludes通过翻译可以知道是 排除或者过滤 staffs这个对象参与Json转换;
其实这个还有种做法供你参考: 假设两个实体类: Shop.java & Staff.java 你在Staff.java中 @ManyToOne的字段(private Shop shop;)上面加上 @JsonIgnore 即可,如下: public Class Staff{ @ManyToOne @JsonIgnore private Shop shop; public void setShop(Shop shop){ this.shop = shop; } ... } 建议用FastJson来转换你的对象,在大量数据的情况下fastejson的转换效率更高 |
|