sky丶斌
骑士
骑士
  • 最后登录2022-06-28
  • 发帖数29
阅读:14489回复:3

JSON+Hibernate死循环问题的解决办法

楼主#
更多 发布于:2016-08-16 17:48
在我们使用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成功取到了关联对象中的值,然而这句代码的内部是怎样实现的我还是没搞懂,哪位大神知道的可以在评论中讨论一下,嘻嘻...
oliver
VIP
VIP
  • 最后登录2017-08-15
  • 发帖数4
沙发#
发布于:2016-08-30 14:10
sky丶斌:这中写法算是注解吗?回到原帖
是的,JPA标准的默认实现方式
sky丶斌
骑士
骑士
  • 最后登录2022-06-28
  • 发帖数29
板凳#
发布于:2016-08-18 23:47
oliver:SetExcludes通过翻译可以知道是 排除或者过滤 staffs这个对象参与Json转换;
其实这个还有种做法供你参考:
假设两个实体类:
Shop.java & Staff.java
你在Staff.java中 @ManyTo...
回到原帖
这中写法算是注解吗?
oliver
VIP
VIP
  • 最后登录2017-08-15
  • 发帖数4
地板#
发布于: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的转换效率更高
游客


返回顶部

公众号

公众号