【FastJSON】解决FastJson中“$ref 循环引用”的问题

0、开发环境

  SSH,EasyUI,MySQL 

1、需求要求:

  (1)首先获取所有的贷款订单数据,即List <LoanOrder>。

  (2)然后从单个贷款订单实体LoanOrder去访问贷款人实体Loaner的信息。 

2、实体之间的关系描述

  (1)LoanOrder实体与Loaner实体是双向的多对一和一对多关系。

  (2)LoanOrder是“多方”,其中的关系属性为“private Loaner loaner”。

  (3)Loaner是“一方”,其中的关系属性为“Set<LoanOrder> orders”。 

3、代码示例

  (1) 贷款订单LoanOrder代码

@Entity
@Table(name = "t_bp_loan_order")
public class LoanOrder implements java.io.Serializable {/*省略其他次要属性*/private Loaner loaner;@ManyToOne(fetch = FetchType.LAZY)@JoinColumn(name = "LOANER_ID")public Loaner getLoaner() {return this.loaner;}
}

(2) Loaner方代码

@Entity
@Table(name = "t_bp_loaner")
public class Loaner implements java.io.Serializable {/* 其他普通属性略去 */private Set<LoanOrder> loanOrders = new HashSet<LoanOrder>(0);@OneToMany(fetch = FetchType.LAZY, mappedBy = "loaner")@JSONField(serialize = true)public Set<LoanOrder> getLoanOrders() {return this.loanOrders;}
}

【障碍再现】

1、需求01:

首先获取所有的贷款订单数据,即List <LoanOrder>,发现贷款人“张三”有两个订单。

 

2、需求02:

  然后,依次在第一个和第二个贷款订单中点击“张三”,从而去访问“名字叫做‘张三’”贷款人实体Loaner的信息。

结果,第一个订单可以显示贷款人的数据,但是在第二个订单数据中,不能获取到“loaner(贷款人)”的数据,并且loaner中提示“$ref”。

经过两次点击后,服务器后台传送到前台页面上的JSON数据如下所示:

 

【解决方案】

第一步:禁用FastJson的“循环引用检测”特性。

1、核心代码

 

2、作用

决定了生成的“多个”JSON对象中,是否加载被引用的同一个对象的数据。

在此,决定了生成的“多个”贷款订单JSON对象中,是否加载被引用的同一个贷款人JSON对象的数据。

 

3、开启和关闭FastJson的“循环引用检测”特性的对比

 

当从服务器端传来的多个LoanOrder对象通过FASTJSON被序列化到“前端”后,会被浏览器解析成“DOM”对象。 

(1) 当开启FastJson的“循环引用检测”特性时:

1)对于第一个LoanOrder 01,fastjson会完全解析并加载它的所有数据,包括它所关联的Loaner贷款人信息,如下图所示。

 

2) 对于第二个LoanOrder 02,fastjson仅仅解析并加载其贷款订单部分的数据,对于“$ref”所指向的 Loaner贷款人的数据,fastjson会因为“开启了fastJson的‘循环引用检测’机制”而不去加载该贷款人数据。

当加载第二个贷款订单数据时,fastjson检测到已经在第一个订单LoanOrder 01中加载了“贷款人Loaner”的数据,fastjson会因为“开启了‘循环引用检测’机制”而不去再次加载该贷款人数据,而仅仅将一个指向第一个贷款订单LoanOrder01中“贷款人”的引用赋值给第二个贷款订单中的贷款人的位置。

因此,在生成的第二个贷款订单的JSON串中,对于贷款人信息,仅仅只有一个“$ref”。

而jQuery这个前端技术又无法解析该引用,因此,就无法读取贷款人的数据,如下图所示。

 

第二步:禁止Loaner对象获取Set<LoanOrder>的数据。

方法一:将原来的“双向关系”修改为“单向关系”

1、原来:LoanOrder与Loaner之间是双向关系。

2、修改后:只能从LoanOrder访问Loaner,从Loaner无法访问到LoanOrder。

3、具体方法01

       重要前提:不删除Loaner中的“Set<LoanOrder> orders”属性。

  注意,若在采用注解映射实体类的方式中,没有使用“@Transient”注解,则数据库会报错。

4、具体方法02

       直接删除“Set<LoanOrder> orders”属性极其相关的setter()和getter()方法。

      

方法二:不修改关系的前提下,禁止序列化

在不修改LoanOrder和Loaner双向关系的情况下,Loaner对象中的Set<LoanOrder>集合完成数据的加载,当其向前端Browser传递JSON数据时,禁止序列化Set<LoanOrder>集合。

具体方法:

设置注解“@JSONField(serialize = false)”。

说明:

A.“@JSONField”是fastjson提供的注解标签,其作用为控制其所标注的属性“能否被序列化”。

B.在此其作用为:禁止"loanOrders"这个Set集合被序列化。

具体如下图所示。

 

 

【解决后的效果】 

 

读者如要转载,请标明出处和作者名,谢谢。
地址01:http://space.itpub.net/25851087
地址02:http://www.cnblogs.com/zjrodger

转载于:https://www.cnblogs.com/zhujiabin/p/6132951.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 枚举内嵌枚举_Java枚举益智游戏

java 枚举内嵌枚举假设我们有以下代码&#xff1a; enum Case {CASE_ONE,CASE_TWO,CASE_THREE;private static final int counter;private int valueDependsOnCounter;static {int sum 0;for(int i 0; i<10; i) {sum i;}counter sum;} Case() {this.valueDependsOnCounte…

Java注释 link_Java 文档注释

Java只是三种注释方式。前两种分别是// 和/* */&#xff0c;第三种被称作说明注释&#xff0c;它以/** 开始&#xff0c;以 */结束。说明注释允许你在程序中嵌入关于程序的信息。你可以使用javadoc工具软件来生成信息&#xff0c;并输出到HTML文件中。说明注释&#xff0c;是你…

JavaFX真实世界应用程序:EIZO CuratOR Caliop

JavaFX Real-World应用程序第四号称为Caliop 。 它是EIZO为医院手术室开发的CuratOR解决方案的前端。 前端在壁挂式控制台上运行&#xff0c;并允许操作团队查找有关患者的信息&#xff0c;控制各种视频源到不同监视器的路由&#xff0c;录制视频&#xff0c;拍摄照片/剧照。 …

约瑟夫问题(java实现)

方法一、自定义的链表实现package com.code.yuesefu;public class YueSeFuList {public static void main(String[] args) {int count 41;//申请一个指定长度的链表Node n YueSeFuList.createNodes(count);for(int i0;i<count;i){Node second n.next;//第2个n n.next.ne…

java多线程流式写入文件夹_java多线程写入同一文件

1.[代码][Java]代码package com.thread;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.concurrent.ConcurrentLinkedQueue;/*** 多线程下写文件* author owen.huang**//*** 将要写入…

Duilib嵌入CEF以及JavaScript与C++交互

转载:http://blog.csdn.net/foruok/article/details/50573612 转载:http://blog.csdn.net/foruok/article/details/50584985 转载:http://blog.csdn.net/mfcing/article/details/44539035 转载:https://github.com/fanfeilong/cefutil/blob/master/doc/CEF_JavaScript_Cpp.md 转…

layui分页limit不显示_【图片】新手 分页显示不了呀【layui吧】_百度贴吧

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼$(function () {layui.use([table, layer], function () {layer layui.layer, layuiTable layui.table;tabSalesList layuiTable.render({elem: "#JFTZTJ",totalRow: true,url: /DailyRoutine/MembershipManagement/O…

netbeans代码提示_NetBeans可用性提示

netbeans代码提示的Java IDE都来了&#xff0c;因为在很长的路要走天的JBuilder的 &#xff08;尽管JBuilder中似乎是一个值得欢迎提前在时间&#xff09;。 当今的Java IDE&#xff08;例如NetBeans &#xff0c; Eclipse &#xff0c; IntelliJ IDEA和JDeveloper &#xff09…

推荐文章:机器学习:“一文读懂机器学习,大数据/自然语言处理/算法全有了...

PS:文章主要转载自CSDN大神"黑夜路人"的文章: http://blog.csdn.NET/heiyeshuwu/article/details/43483655 本文主要对机器学习进行科普,包括机器学习的定义、范围、方法,包括机器学习的研究领域&#xff1a;模式识别、计算机视觉、语音识别、自然语言…

java比较炫的登录界面_html+css实现漂亮的透明登录页面,HTML实现炫酷登录页面...

承蒙各位小伙伴的支持&#xff0c;鄙人有幸入围了《CSDN 2020博客之星》的前200名&#xff0c;现在进入投票环节&#xff0c;如果我平时写的文章和分享对你有用的话&#xff0c;请每天点击一下这个链接&#xff0c;投上你们宝贵的一票吧&#xff01;谢谢&#xff01;❤️ 每一票…

在OpenShift上扩展Java EE微服务

这个小系列的前两个部分介绍了如何使用WildFly Swarm构建一个微型JAX-RS服务并将其打包到Docker映像中 。 您学习了如何将此示例部署到OpenShift &#xff0c;现在该进行一点扩展了。 为什么扩展很重要 基于微服务的体系结构的关键方面之一是分解为高性能的单个服务&#xff0…

mssql 远程无法连接mysql_在本地 怎么远程连接MSSQL数据库

hp连接mssql数据库有几个注意事项&#xff0c;尤其mssql的多个版本、32位、64位都有区别。首先&#xff0c;php.ini文件中;extensionphp_pdo_mssql.dll ;extensionphp_pdo_odbc.dll 前面的分号去掉&#xff0c;对应的使哪种方式连接mssql。注意要重启服务使其生效。一、建立连接…

jQuery 一些小技巧

1. 返回顶部按钮 可以利用 animate 和 scrollTop 来实现返回顶部的动画&#xff0c;而不需要使用其他插件。 // Back to top $(a.ktop).click(function () { $(document.body).animate({scrollTop: 0}, 800);…

OpenMap教程第2部分–使用MapHandler构建基本地图应用程序–第1部分

1.简介 在第一个教程中&#xff0c;我们创建了一个基本的OpenMap GIS应用程序&#xff0c;该应用程序在JFrame中显示一个从文件系统加载的具有一个形状图层的地图。 该教程基于com.bbn.openmap.app.example.SimpleMap 。 在该教程中&#xff0c;我们使用了以下OpenMap类&#x…

JS实战 · 复选框全选操作

思路&#xff1a;1、获取被选中checkbox&#xff0c;通过checked属性的状态完成&#xff1b;2、获取被选中的checkbox的value值&#xff1b;3、求所有value的和sum&#xff1b;4、定义span区域存储和sum&#xff1b;代码如下&#xff1a;<html><head><meta http…

java二叉树删除子树_132-BST删除有一颗子树的结点

2.网上数据结构和算法的课程不少&#xff0c;但存在两个问题&#xff1a;1)授课方式单一&#xff0c;大多是照着代码念一遍&#xff0c;数据结构和算法本身就比较难理解&#xff0c;对基础好的学员来说&#xff0c;还好一点&#xff0c;对基础不好的学生来说&#xff0c;基本上…

使用djcproxy创建代理对象

在过去的几周中&#xff0c;我展示了如何使用Java Reflection API和cglib创建代理对象。 在本文中&#xff0c;我将向您展示如何使用djcproxy做到这一点。 哦&#xff0c;不是&#xff0c;另一个代理实现&#xff01; 除了我创建此代理的自私事实之外&#xff0c;还要写些什么…

lightoj1145 【DP优化求方案】

题意&#xff1a; 有一个k面的骰子&#xff0c;然后问你n个骰子朝上的面数字之和s的方案&#xff1b;思路&#xff1a;dp[i][j] 代表 前 i 个骰子组成 j 有多少种方案&#xff1b;显然dp[i][j] dp[i - 1][j - 1] dp[i - 1][j - 2] ... dp[i - 1][j - k];我们算 dp[i][j] 的…

java rx.observable_Rxjava2 Observable的条件操作符详解及实例

简要&#xff1a;需求了解&#xff1a;在使用 Rxjava 开发中&#xff0c;经常有一些各种条件的操作 &#xff0c;如比较两个 Observable 谁先发射了数据、跳过指定条件的 Observable 等一系列的条件操作需求&#xff0c;那么很幸运&#xff0c; Rxjava 中已经有了很多条件操作符…

Linux poll 和 select 机制

poll select 介绍 使用非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll, select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一个 或多个文件而不阻塞. 这些调用也可阻塞进程直到任何一个给定集合的文件描述符可用来 读或写.…