SpringMVC、Hibernate系列之级联对象的json序列化

SpringMVC、Hibernate系列之级联对象的json序列化   SpringMVC、Hibernate系列之级联对象的json序列化   SpringMVC、Hibernate系列之级联对象的json序列化

最近为了加深学习Spring和Hibernate,就利用Spring4、Hibernate5搭建了SpringMVC与Hibernate整合的平台框架。搭建过程曾遇到了一系列的棘手问题,在这里将相应的解决方案给予记录和分享。

问题描述

利用Jackson序列化Hibernate一对多关联对象时,出现死循环。花费了1天半时间,必须记录下来。

问题分析

很显然是由于Jackson序列化的深度序列化引起的。Hibernate的级联对象难免会存在各式各样的循环嵌套,更甚至自关联的情况。解决的思路有两种:第一种,生成对象识别码,避免对象被重复序列;第二种,避免深度序列化

问题解答

第一种.生成对象识别码,避免对象被重复序列

这里可以使用Jackson 2.0+版本新注解——@JsonIdentityInfo,作用于类或属性上,被用来在序列化/反序列化时为该对象或字段添加一个对象识别码,通常是用来解决循环嵌套的问题。弊端——对延迟加载的对象不起作用。使用示例如下:

@JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class, property = "jsonID")
public class Organization extends IdEntity {

第二种.避免深度序列化

注意这里特指“深度”俩字,利用@JsonIgnore注解显然是不能满足的。通过翻阅Jackson 2.0+ API文档,发现了@JsonIgnoreProperties注解现在能用在属性上了,效果就是子对象中不再包含过滤掉的的属性,而对象本身则依然包含。经测试,延迟加载也不成问题,推荐使用。使用示例如下:

@JsonIgnoreProperties(value = { "childOrgList", "userList", "parentOrg" })
private List<Organization> childOrgList;// 下级部门

最终效果

{
    "code": 0,
    "message": "",
    "result": {
        "id": 2,
        "name": "媒资事业部",
        "fullPath": "/****/媒资事业部",
        "parentOrg": {
            "id": 1,
            "name": "****",
            "fullPath": "/****"
        },
        "childOrgList": [
            {
                "id": 4,
                "name": "网络研发中心",
                "fullPath": "/****/媒资事业部/网络研发中心"
            },
            {
                "id": 9,
                "name": "网络研发测试部",
                "fullPath": "/****/媒资事业部/网络研发测试部"
            }
        ],
        "userList": []
    }
}

Best Wishes For You!

上一篇:SQL Server触发器


下一篇:JAVA设计模式(1)工厂模式