<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Kevin.Zhong

    彪悍的人生不需要解釋,彪悍的代碼不需要測(cè)試。

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      17 隨筆 :: 12 文章 :: 14 評(píng)論 :: 0 Trackbacks

      在Java中的模型關(guān)系設(shè)計(jì)中,循環(huán)的關(guān)系是很常見(jiàn)的,特別是ORM的出現(xiàn),關(guān)系的循環(huán)更加有利于維護(hù)各自的狀態(tài)。但就是這種循環(huán)的關(guān)系,在java對(duì)象序列化時(shí),不可避免的會(huì)導(dǎo)致循環(huán)引用(Cycle Reference)的問(wèn)題。


    導(dǎo)致CycleReference的情況

      
     還是舉個(gè)例子吧(代碼說(shuō)話):一個(gè)很典型,很常見(jiàn)的雙向引用的對(duì)象關(guān)系。

     1@Entity
     2
     3public class Company{
     4
     5    @Id
     6
     7    @Column(.)
     8
     9    private String id;
    10
    11    @OneToMany(.)
    12
    13    private Set<Employee> employee = new HashSet<Employee>();
    14
    15    //setters/getters
    16
    17    
    18
    19}

    20
    21@Entity
    22
    23public class Employee{
    24
    25    @Id
    26
    27    @Column(.)
    28
    29    private String id;
    30
    31    @ManyToOne
    32
    33    private Company company;
    34
    35    //setters/getters
    36
    37    
    38
    39}

    40
    41


    另外一種導(dǎo)致這個(gè)問(wèn)題的情況是,多個(gè)對(duì)象間關(guān)系形成一條回路,跟電學(xué)有點(diǎn)像。(具體就不舉例了,在模型設(shè)計(jì)時(shí),最好還是避免出現(xiàn)這種情況。)

    導(dǎo)致這種問(wèn)題的原因

    用jaxb(如果沒(méi)有特殊解釋,本文采用的都是jaxb)序列化Company時(shí),無(wú)疑會(huì)發(fā)生循環(huán)引用。
    當(dāng)序列化引擎解析Company時(shí),它發(fā)現(xiàn)這個(gè)對(duì)象持有一個(gè)Employee的引用,轉(zhuǎn)而去騷擾Employee。解析Employee時(shí),發(fā)現(xiàn)他又持有Company的引用,又轉(zhuǎn)回Company。如此問(wèn)題產(chǎn)生。
    引擎它并不知道在遇到循環(huán)引用問(wèn)題時(shí),該怎么處理,它只是忠實(shí)得按照固定的算法去執(zhí)行任務(wù)。所以我們得讓引擎聰明點(diǎn),我們得讓引擎遇到這種問(wèn)題有處理機(jī)制。

    解決問(wèn)題

    既然需要引擎更聰明,那就沒(méi)辦法,就得燒香拜佛,希望制造商的產(chǎn)品擴(kuò)展性足夠好,考慮了足夠多的情況。
    幸運(yùn)的是,jaxb提供了有這種擴(kuò)展。(CycleRecoverable接口)
    行軍打仗(例子先行):(將以上的例子改下)

     1@Entity
     2
     3public class Company implements CycleRecoverable{
     4
     5    @Id
     6
     7    @Column(.)
     8
     9    private String id;
    10
    11    @OneToMany(.)
    12
    13    private Set<Employee> employee = new HashSet<Employee>();
    14
    15    //當(dāng)遇到循環(huán)引用時(shí),用temp替代this,返給jaxb解析。
    16
    17    public Object onCycleDetected(Context arg0) {
    18
    19        Company temp = new Company ();
    20
    21        temp.setId(id);
    22
    23        return temp;
    24
    25    }

    26
    27    //setters/getters
    28
    29    
    30
    31}

    32
    33@Entity
    34
    35public class Employee implements CycleRecoverable{
    36
    37    @Id
    38
    39    @Column(.)
    40
    41    private String id;
    42
    43    @ManyToOne
    44
    45    private Company company;
    46
    47    public Object onCycleDetected(Context arg0) {
    48
    49        Employee temp = new Employee();
    50
    51        temp.setId(id);
    52
    53        return temp;
    54
    55    }

    56
    57  //setters/getters
    58
    59    
    60
    61}

    62
    63


    注意到onCycleDetected方法就是一個(gè)回調(diào)方法,當(dāng)遇到循環(huán)引用時(shí),jaxb引擎會(huì)調(diào)用這個(gè)方法,用return對(duì)象來(lái)替換this。所以在這個(gè)過(guò)程中,就可以將引起循環(huán)引用問(wèn)題的關(guān)系斷開(kāi),返回給jaxb
    當(dāng)然Company和Employee對(duì)象沒(méi)必要全部實(shí)現(xiàn)CycleRecoverable接口,但是拿到現(xiàn)實(shí)的模型圖中去,誰(shuí)也保證不了他們不跟別的對(duì)象有循環(huán)的關(guān)系存在。因此還是建議大家把模型都實(shí)現(xiàn)這個(gè)接口,也好一勞永逸。

    希望大家得到了想要的東西。
    Thanks

    posted on 2009-01-05 11:17 Kevin.Zhong 閱讀(3030) 評(píng)論(4)  編輯  收藏 所屬分類: rest

    評(píng)論

    # re: java對(duì)象序列化所引起的循環(huán)引用的思考 2009-01-06 09:11 yeshucheng
    這個(gè)就是所謂的對(duì)象圖序列化吧  回復(fù)  更多評(píng)論
      

    # re: java對(duì)象序列化所引起的循環(huán)引用的思考 2009-01-06 09:16 Kevin.Zhong
    @yeshucheng
    是的,如果需要將模型推向前臺(tái),序列化模型是很常見(jiàn)的做法。  回復(fù)  更多評(píng)論
      

    # re: java對(duì)象序列化所引起的循環(huán)引用的思考 2009-01-06 09:30 congdepeng@126.com

    我可以引用這句話嗎
    彪悍的人生不需要解釋,彪悍的代碼不需要注釋。
      回復(fù)  更多評(píng)論
      

    # re: java對(duì)象序列化所引起的循環(huán)引用的思考 2009-01-06 12:41 Kevin.Zhong
    @congdepeng@126.com
    我改了,彪悍的代碼不需要測(cè)試。哈哈。  回復(fù)  更多評(píng)論
      


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲成av人片在线观看无码不卡| 亚洲欧洲中文日产| 老司机69精品成免费视频| 国产精品亚洲mnbav网站 | 亚洲av片劲爆在线观看| 丁香花免费完整高清观看| mm1313亚洲国产精品无码试看| 久久青青草原亚洲av无码| 99久久免费国产香蕉麻豆 | 亚洲电影免费在线观看| 亚洲国产精品成人精品软件| 亚洲第一视频在线观看免费| 最近免费中文字幕mv电影| 国产亚洲精品国产福利在线观看 | 亚洲AV成人片无码网站| 亚洲动漫精品无码av天堂| 无码一区二区三区免费视频| 久久精品成人免费国产片小草| 亚洲成a人片在线观看中文!!!| 亚洲AV无码不卡在线观看下载| 国产成人免费在线| 又硬又粗又长又爽免费看 | 亚洲狠狠婷婷综合久久久久| 久久不见久久见免费影院| a在线观看免费网址大全| 亚洲老熟女五十路老熟女bbw| 精品国产亚洲一区二区三区| 日本特黄特色免费大片| 久久免费看黄a级毛片| 久久免费99精品国产自在现线| 亚洲私人无码综合久久网| 久久精品国产亚洲AV果冻传媒 | 久久久久亚洲AV无码永不| 免费播放春色aⅴ视频| 久久久久国色AV免费观看性色| 色www永久免费网站| 色爽黄1000部免费软件下载| 亚洲欧美国产国产综合一区| 亚洲激情电影在线| 亚洲a一级免费视频| 久久亚洲av无码精品浪潮|