国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
對JPA實體關(guān)系管理雙向關(guān)聯(lián)的一些思考
  • 現(xiàn)象
    在使用JPA進(jìn)行實體關(guān)系管理的時候,會產(chǎn)生無限循環(huán)的情況,如果使用fastjson來進(jìn)行序列化,則表現(xiàn)形式如下:

    {    "address":{        "id":63,        "name":"1address name",        "person":{"$ref":".."},        "zipCode":"ZipCode01"    },    "firstName":"0firstName",    "id":69,    "lastName":"0lastName"},{    "address":{        "id":64,        "name":"2address name",        "person":{"$ref":".."},        "zipCode":"ZipCode11"    },    "firstName":"1firstName",    "id":70,    "lastName":"1lastName"}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    重點是address.person的值:{"$ref":".."}
    如果你用的不是fastjson(它默認(rèn)會檢查該對象是否已經(jīng)存在在json文本中)而是其他一些json類庫,比如jackson,則會拋出java.lang.StackOverflowError異常(無限循環(huán)產(chǎn)生的棧溢出所導(dǎo)致).
    但是,哪怕你用的是fastjson,你也無法用js來解析{"$ref":".."}.

  • 解決思路

    • 使用fastjson自帶的JSON.toJSONString(page,SerializerFeature.DisableCircularReferenceDetect)
      • 優(yōu)點:解決快速
      • 缺點:
        • 序列化后的json文本包含太多不需要的信息,冗雜程度太高
        • 方式太死板,沒有相應(yīng)的注解來實現(xiàn)(jackson有一個),接口只能返回String類型了.
    • 重新設(shè)計實體關(guān)系,盡量避免雙向關(guān)聯(lián),使用RESTful進(jìn)行接口的暴露.(舉個例子來說)

      • 優(yōu)點:邏輯清晰,結(jié)構(gòu)更合理
      • 缺點:
        • 對老代碼改動較大.
        • 實現(xiàn)較復(fù)雜,要對整體業(yè)務(wù)邏輯有清晰的認(rèn)識.

      實體類Person

      public class Person {    private String name;    @Id    @GeneratedValue    private Long id;    @ManyToMany    @JoinColumn(name = "address_id")    private List<Address> addresses;    // ...... getter and setter}
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13

      實體類Address

      public class Address {    @Id    @GeneratedValue    private Long id;    private String name;    private String zipCode;    // ...... getter and setter}
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      兩個實體類之間的關(guān)系為Many Person To Many Address,只在Person實體類中進(jìn)行關(guān)系的配置,避免雙向關(guān)聯(lián).

      下面舉例說明使用RESTful來對資源進(jìn)行訪問的情況.

      對于Person:

      • 1 查詢所有Person: /persons
      • 2 查詢某一個Person: /persons/{person_id}
      • 3 查詢某一個Person的所有Address: /persons/{person_id}/addresses
      • 4 查詢某一個Person的某一個Address: /persons/{person_id}/addresses/{address_id}

        如果要查詢一個Address有幾個Person: /persons?address.id=xxx (帶分頁,自己設(shè)置pageSize)

      對于Address:

      • 1 查詢所有Address: /addresses
      • 2 查詢某一個Address: /addresses/{address_id}

      以上是Person和Address的一些簡單接口.其中粗體部分為關(guān)聯(lián)查詢.
      設(shè)計的思路就是要盡量避免雙向關(guān)聯(lián),然后把Person作為一個資源,把Address作為Person的一個子資源或者屬性.
      上述Person中的1 2 將Address作為了屬性,查詢時可以通過參數(shù)傳遞進(jìn)去.而上述Person中的3 4 兩個接口則將Address作為一個子資源進(jìn)行管理.

      如果要用Address來作為一個資源反查Person怎么辦?
      在一個Address管理頁面,需求要求列出某一個住址下的Person:

      • 點擊某一項:
        Address發(fā)起/persons?address.id=xxx請求,取得List<Person>.
      • 默認(rèn)顯示:
        在controller層對/persons?address.id_in=xxx1,xxx2,xxx3接口的返回值進(jìn)行處理,取得List<Address>和其對應(yīng)的List<Person>
  • 總結(jié)
    盡量避免雙向關(guān)聯(lián),使用更合理的API設(shè)計方式,合理區(qū)分子資源和屬性.
    大大減少數(shù)據(jù)庫壓力!

  • 本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
    打開APP,閱讀全文并永久保存 查看更多類似文章
    猜你喜歡
    類似文章
    hibernate 延遲加載深入分析(persistentSet的延遲加載)
    Jpa返回對象必須是與Entity類么?
    Hibernate 主鍵關(guān)聯(lián)中的一對一關(guān)聯(lián)
    Eclipse快速上手Hibernate--6.關(guān)聯(lián)映射(一對一)(1)
    JPA學(xué)習(xí)筆記
    淺談mybatis和jpa的區(qū)別
    更多類似文章 >>
    生活服務(wù)
    分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
    綁定賬號成功
    后續(xù)可登錄賬號暢享VIP特權(quán)!
    如果VIP功能使用有故障,
    可點擊這里聯(lián)系客服!

    聯(lián)系客服