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

简介:        最近为了加深学习Spring和Hibernate,就利用Spring4、Hibernate5搭建了SpringMVC与Hibernate整合的平台框架。搭建过程曾遇到了一系列的棘手问题,在这里将相应的解决方案给予记录和分享。 问题描述 利用Jackson序列化Hibernate一对多关联对象时,出现死循环。花费了1天半时间,必须记录下来。 问题分析 很显然是由于

      

最近为了加深学习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!

目录
相关文章
|
1月前
|
缓存 安全 PHP
PHP中的魔术方法与对象序列化
本文将深入探讨PHP中的魔术方法,特别是与对象序列化和反序列化相关的__sleep()和__wakeup()方法。通过实例解析,帮助读者理解如何在实际应用中有效利用这些魔术方法,提高开发效率和代码质量。
|
6天前
|
JSON JavaScript Java
对比JSON和Hessian2的序列化格式
通过以上对比分析,希望能够帮助开发者在不同场景下选择最适合的序列化格式,提高系统的整体性能和可维护性。
12 3
|
11天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
13天前
|
JSON JavaScript 前端开发
|
22天前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
24天前
|
JSON 前端开发 数据格式
前端的全栈之路Meteor篇(五):自定义对象序列化的EJSON介绍 - 跨设备的对象传输
EJSON是Meteor框架中扩展了标准JSON的库,支持更多数据类型如`Date`、`Binary`等。它提供了序列化和反序列化功能,使客户端和服务器之间的复杂数据传输更加便捷高效。EJSON还支持自定义对象的定义和传输,通过`EJSON.addType`注册自定义类型,确保数据在两端无缝传递。
|
1月前
|
存储 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
|
1月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
|
1月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
54 2