hibernate懒加载导致jackjson解析json时StackOverFlow
@JsonIgnore @JsonFilter @JsonBackReference @JsonManagedReference @JsonIgnoreProperties
jackson中的@JsonBackReference和@JsonManagedReference,以及@JsonIgnore均是为了解决对象中存在双向引用导致的无限递归(infinite recursion)问题。这些标注均可用在属性或对应的get、set方法中。
@JsonBackReference和@JsonManagedReference:这两个标注通常配对使用,通常用在父子关系中。@JsonBackReference标注的属性在序列化(serialization,即将对象转换为json数据)时,会被忽略(即结果中的json数据不包含该属性的内容)。@JsonManagedReference标注的属性则会被序列化。在序列化时,@JsonBackReference的作用相当于@JsonIgnore,此时可以没有@JsonManagedReference。但在反序列化(deserialization,即json数据转换为对象)时,如果没有@JsonManagedReference,则不会自动注入@JsonBackReference标注的属性(被忽略的父或子);如果有@JsonManagedReference,则会自动注入自动注入@JsonBackReference标注的属性。
@JsonIgnore:直接忽略某个属性,以断开无限递归,序列化或反序列化均忽略。当然如果标注在get、set方法中,则可以分开控制,序列化对应的是get方法,反序列化对应的是set方法。在父子关系中,当反序列化时,@JsonIgnore不会自动注入被忽略的属性值(父或子),这是它跟@JsonBackReference和@JsonManagedReference最大的区别。
@JsonIgnoreProperties 用法
- //忽略parent models属性
 - @JsonIgnoreProperties({"parent","models"})
 - public class Module{
 - @OneToMany(fetch=FetchType.LAZY,mappedBy="parent",cascade=CascadeType.REMOVE)
 - public java.util.List<Module> models;
 - @ManyToOne(fetch=FetchType.LAZY)
 - @JoinColumn(name="parent_id",referencedColumnName="id")
 - public Module parent;
 - }
 
@JsonFilter用法
- //忽略parent models属性
 - @JsonFilter("module")
 - public class Module{
 - @OneToMany(fetch=FetchType.LAZY,mappedBy="parent",cascade=CascadeType.REMOVE)
 - public java.util.List<Module> models;
 - @ManyToOne(fetch=FetchType.LAZY)
 - @JoinColumn(name="parent_id",referencedColumnName="id")
 - public Module parent;
 - }
 
- 测试代码:
 - Module module=moduleService.findModuleByName("文件管理");
 - ObjectMapper mapper=new ObjectMapper();
 - FilterProvider filterProvider=new SimpleFilterProvider().addFilter("module", SimpleBeanPropertyFilter.serializeAllExcept("parent","models"));
 - mapper.setFilters(filterProvider);
 - String resultString=mapper.writeValueAsString(module);
 
JsonFilter可以动态指定过滤的属性,缺点:每次转换都要设置过滤器,否则会报错,就这点很不爽。既然不爽就换种方式过滤,使用fastjson,请看下面的代码:
- package com.company.project.common.util;
 - import java.util.Map;
 - import java.util.Map.Entry;
 - import java.util.Set;
 - import com.alibaba.fastjson.JSON;
 - import com.alibaba.fastjson.serializer.JSONSerializer;
 - import com.alibaba.fastjson.serializer.PropertyFilter;
 - import com.alibaba.fastjson.serializer.SerializeWriter;
 - import com.alibaba.fastjson.serializer.SerializerFeature;
 - public class JsonHelpler {
 - public static String toJSON(Object o){
 - return JSON.toJSONString(o,SerializerFeature.WriteMapNullValue);
 - }
 - public static SerializeWriter toJSON(Object obj, final Map<Class<?>, Set<String>> includeMap){
 - PropertyFilter filter = new PropertyFilter() {
 - @Override
 - public boolean apply(Object source, String name, Object value) {
 - for(Entry<Class<?>, Set<String>> entry : includeMap.entrySet()) {
 - Class<?> class1 = entry.getKey();
 - if(source.getClass() == class1){
 - Set<String> fields = entry.getValue();
 - for(String field : fields) {
 - if(field.equals(name)){
 - return false;
 - }
 - }
 - }
 - }
 - return true;
 - } };
 - SerializeWriter sw = new SerializeWriter();
 - JSONSerializer serializer = new JSONSerializer(sw);
 - serializer.getPropertyFilters().add(filter);
 - serializer.write(obj);
 - return sw;
 - }
 - }
 - 测试代码
 - Map<Class<?>, Set<String>> includeMap = new HashMap<Class<?>, Set<String>>();
 - Set<String> set = new HashSet<String>();
 - set.add("parent");
 - set.add("models");
 - includeMap.put(Module.class, set);
 - SerializeWriter resultString=JsonHelpler.toJSON(module, includeMap);
 - System.out.println(resultString);
 
hibernate懒加载导致jackjson解析json时StackOverFlow的更多相关文章
- Hibernate懒加载导致json数据对象传输异常的问题---(非常重要)
		
1. 异常: [console_demo][WARN] [2016-12-15 19:49:35] org.springframework.web.servlet.mvc.support.Defaul ...
 - Hibernate懒加载解析
		
Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来 ...
 - -java转json hibernate懒加载造成的无限递归问题
		
1.在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系. JoinColumn(name="pid") 2. 在保存数据时,总是先保存的 ...
 - hibernate懒加载(转载)
		
http://blog.csdn.net/sanjy523892105/article/details/7071139 懒加载详解 懒加载为Hibernate中比较常用的特性之一,下面我们详细来了解下 ...
 - hibernate懒加载
		
Hibernate懒加载解析 hibernatejoinsession数据库sqlobject Hibernate懒加载解析 在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适 ...
 - Hibernate懒加载深入分析
		
Hibernate懒加载深入分析 懒加载可以提高性能吗? 不可以简单的说"能",因为Hibernate的关系映射拖累了SQL的性能,所以想出懒加载来弥补.只是弥补而以,不会超越. ...
 - 关于s2sh框架关于hibernate懒加载问题的说明和解决方案
		
首先我们来看下面这个图,解释了一个web程序的一次请求流程! 懒加载异常的说明: 懒加载就是我们在查询一个对象时,它所有的属性是否要被查出来! 如果懒加载开启的话,session在service层就被 ...
 - Hibernate懒加载的三种解决方案
		
Hibernate懒加载的两种解决方案: 1.Hibernate.initialize(代理对象) 2.在*.hbm.xml映射文件中添加lazy="false"属性 3.使用op ...
 - 关于Hibernate懒加载问题的最终解决方案
		
看到一篇Hibernate懒加载的文章,所以转载,原地址如下: http://tuoxie007.iteye.com/blog/334853 Hibernate的强大之处之一是懒加载功能,可以有效的降 ...
 
随机推荐
- 【BZOJ3223】文艺平衡树(Splay)
			
题面 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...
 - Heavy Transportation POJ - 1797
			
题意 给你n个点,1为起点,n为终点,要求所有1到n所有路径中每条路径上最小值的最最值. 思路 不想打最短路 跑一边最大生成树,再扫一遍1到n的路径,取最小值即可,类似Frogger POJ - 22 ...
 - php表单提交时获取不到post数据的解决方法
			
找到了一位博主的方法完美解决,链接如下: http://blog.csdn.net/whd526/article/details/53263181
 - 关于Android sdkmanager目录结构的总结
			
SDK Platform是指一些已经编写好的库函数,类文件,我们可以直接调用 Samples for SDK是指一些样本代码,可以导入eclipse运行出来查看里面函数的效果 以system imag ...
 - oracle sql model从句demo
			
model从句作用 sql model可以完成像EXCEL工作表的数据内容扩展.计算填充的功能 关键词解释 partition 分区关键词,白话就是分组 dimension 度量关键词,白话就是要取出 ...
 - Python 中的登陆获取数据跳转页面(不含数据库)
			
简单表单和模板: import os.path import tornado.httpserver import tornado.ioloop import tornado.options impor ...
 - hi-nginx-1.3.4编译安装
			
hi-nginx既是 web 服务器,也是 application 服务器.它开源在https://github.com/webcpp/hi-nginx 它是NGINX的超集,因此与编译NGINX稍有 ...
 - poj  2681  字符串
			
http://poj.org/problem?id=2681 给你任意长度的字符串,找出两串字符中不相同的字符个数(总数) #include<string> #include<cst ...
 - 选择排序—堆排序(Heap Sort)  没看明白,不解释
			
堆排序是一种树形选择排序,是对直接选择排序的有效改进. 基本思想: 堆的定义如下:具有n个元素的序列(k1,k2,...,kn),当且仅当满足 时称之为堆.由堆的定义可以看出,堆顶元素(即第一个元素) ...
 - Mybatis转义字符
			
Mybatis的sql语句中需要用到'>'或者'<'时,不能直接使用. < < 小于号 > > 大于号 & & 和 ' ' 单引号 ...