问题1原因:hibernate中的对象的关联属性默认都是懒加载的,而使用jsonlib这个工具类是通过反射去获取对象中的关联属性的,和我们通过后台直接获取的方式不同,通过后台直接获取管理属性会让hibernate去数据库中查找对应的值再初始化,而采用反射获取是不会进行这个操作的,导致获取的对象的关联属性要么失败要么为空。
问题1解决办法:用阿里巴巴的fastjson工具类代替jsonlib,就没有问题了,强烈推荐!当然也可以将对象的关联属性的配置文件设置为lazy="false",即关闭懒加载,不推荐这种做法!
问题2原因:问题2的现象是这样的,比如我有一个Customer对象,还有个SaleVisit对象,Customer与SaleVisit是一对多的关系,即他们自身都含有对方的关联属性,那我用JSON工具类转换Customer对象的时候,它会去找SaleVisit,而SaleVisit内部又含有Customer,所以又回去找Customer,导致递归无限循环,最终失败!
问题2解决方法:第一步,使用fastjson工具类,fastjson默认关联属性中找原对象的时候将原对象设为空,转换成[{"$ref":"$.rows[0]"}]这种格式。第二步,最好是把你不需要的属性用下面的方式去除。如果是获取Customer对象,那么就在他的关联属性的java文件中对应的自身的关联属性上添加一行注释@JSONField(serialize=false),那么就不会将关联属性转成json。图示如下: