日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

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

發布時間:2023/12/2 javascript 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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

總結

以上是生活随笔為你收集整理的【FastJSON】解决FastJson中“$ref 循环引用”的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。