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

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

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

    posts - 14,  comments - 37,  trackbacks - 0
    CallBack在EJb3 spec中不過是一小章節(jié),似乎不是很引人注意,剛開始,也沒有引起我們的多少注意, 然而,在開發(fā)中,當(dāng)我們實(shí)際運(yùn)用它來解決問題的時(shí)候,發(fā)現(xiàn)它的實(shí)際作用還是很大的。 其實(shí),從根本來說,CallBack相當(dāng)于ORM Engine和用戶設(shè)計(jì)的Domain Model(可持久話的模型) 之間一道天然的鉤子,通過它,設(shè)計(jì)者可以放入很多類似橫切面的關(guān)注點(diǎn)。 下面給出一個(gè)真實(shí)的例子:
    銀行需要對涉及帳務(wù)每一個(gè)操作實(shí)行錄入,復(fù)核機(jī)制。假設(shè)操作涉及實(shí)體有Customer,Account。 錄入紀(jì)錄實(shí)體為InputRecord, 復(fù)核紀(jì)錄為:ConfirmRecord.用戶為User。
    初步設(shè)計(jì)時(shí),這些類的骨干代碼為:
            @Entity
    class User{
    @Id
    long id=-1;
    String userName;
    String passwordHex;
    }
    @Entity
    class Customer{
    @Id
    long id=-1;
    String name;
    @OneToOne
    InputRecord inputRecord;
    @OneToOne
    ConfirmRecord confirmRecord;
    }
    @Entity
    class Account{
    @Id
    long id=-1;
    String accountName;
    String accountNo;
    @OneToOne
    InputRecord inputRecord;
    @OneToOne
    ConfirmRecord confirmRecord;
    }
    //Not a persistence Entity
    abstract class OperationRecord{
    @Id
    long id=-1;
    @ManyToOne
    User user;
    Date date;
    }
    @Entity
    class InputRecord extends OperationRecord{
    //nothing ,just define a concrete class and table
    }
    @Entity
    class ConfirmRecord extends OperationRecord{
    //nothing ,just define a concrete class and table
    }
    
    上面這段代碼有幾點(diǎn)需要說明一下:
    1) OperationRecord沒有聲明為Entity,這里沒有用到繼承策略,因?yàn)閷ο罄^承與數(shù)據(jù)庫之間的映射并不是很好,在一般設(shè)計(jì)中,我是很少使用它的,繼承和數(shù)據(jù)共享兩者是沒有什么關(guān)聯(lián)的, 因?yàn)樵趦?nèi)存中,他們的實(shí)例始終是互補(bǔ)相干的數(shù)據(jù)副本,單純從數(shù)據(jù)來說,分別對應(yīng)到不同的表中來存儲就是最好的映射,而行為的繼承在JVM中可以得到完全的體現(xiàn)。基于這個(gè)認(rèn)識,InputRecord,ConfirmRecord僅僅起表明類型的作用。
    2)從Account,Customer的代碼中可以看出InputRecord,ConfirmRecord域是重復(fù)出現(xiàn)的,而且從需求來看,會有更多的實(shí)體需要這兩個(gè)Field,從1)的分析中,很自然而然的抽取一個(gè)基類出來:

        abstract class ConfirmableEntity{
    @OneToOne
    InputRecord inputRecord;
    @OneToOne
    ConfirmRecord confirmRecord;
    }
    class Customer extends ConfirmableEntity{
    }
    


    到這里,一個(gè)對需求的思考同時(shí)也出現(xiàn)了,在什么地方紀(jì)錄操作記錄呢? AOP? TemplateMethod? 很多種可選的方案。然而,從代碼量和簡潔性來說,CallBack是好的。采用CallBack的基本骨干代碼如下:

        abstract class ConfirmableEntity{
    @PostPersist
    public void registerInputRecord(){
    //retrieve current user
    User currentUser = UserHolder.getCurrentUser();
    //create an inputRecord for current User
    InputRecord inputRec = new InputRecord(currentUser);
    setInputRecord(inputRec);
    }
    }
    

    所有的需要錄入復(fù)核得實(shí)體只要繼承自這個(gè)ConfirmableEntity,不僅獲得數(shù)據(jù),同樣獲得了相應(yīng)的行為。這么一段代碼對于他們來說基本上時(shí)透明的。(有點(diǎn)類似AOP? )上面的代碼中,UserHolder是一個(gè)非常有意思的設(shè)計(jì),用戶的保持一般有不同的需求,在Web中有Session,而在別的應(yīng)用中就不一定使用這樣的機(jī)制了,但不管如何,我們總歸有在領(lǐng)域?qū)犹岢霁@取當(dāng)前操作用戶的需求,一個(gè)很簡單的設(shè)計(jì)會讓很多事情變得簡單,可以把UserHolder當(dāng)作一個(gè)隔離領(lǐng)域?qū)雍途唧wApp層用戶管理的接口,大家如果對它得出現(xiàn)比較有詫異的話可以再具體討論一下.

    值得一說的是,這樣的設(shè)計(jì)對于以后的可擴(kuò)展也帶來了巨大的影響,比如,用戶提出需求:對于已經(jīng)復(fù)核得操作紀(jì)錄不能再被修改,刪除。那么我們只要再在ConfirmableEntity上寫一個(gè)CallBack即可:
        abstract class ConfirmableEntity{
    @PostPersist
    public void registerInputRecord(){
    //retrieve current user
    User currentUser = UserHolder.getCurrentUser();
    //create an inputRecord for current User
    InputRecord inputRec = new InputRecord(currentUser);
    setInputRecord(inputRec);
    }
    @PreUpdate
    @PreRemove
    public void check(){
    if(getConfirmRecord()!=null && getConfirmRecord().getId()>0 )
    throw new SecurityException("can not update/remove confirmed record");
    }
    }
    
    posted on 2007-07-30 11:20 冰封的愛 閱讀(362) 評論(0)  編輯  收藏 所屬分類: J2EE
    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(3)

    隨筆檔案

    文章分類

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲丰满熟女一区二区v| 亚洲综合亚洲综合网成人| 久久精品毛片免费观看| 88av免费观看| 亚洲高清在线观看| 又粗又大又硬又爽的免费视频| 亚洲AV无码专区日韩| 亚洲av无码国产精品夜色午夜 | 亚洲电影免费在线观看| 国产成人精品免费视频大全麻豆| AV大片在线无码永久免费| 国产精品国产午夜免费福利看| 亚洲人成人一区二区三区| 亚洲国产日产无码精品| 无人影院手机版在线观看免费| 亚洲AV蜜桃永久无码精品| 久久久久亚洲AV无码观看| 国产AV无码专区亚洲AV琪琪| 免费黄色电影在线观看| 国产成人涩涩涩视频在线观看免费| 亚洲av日韩精品久久久久久a| 免费视频一区二区| 亚洲欧洲精品在线| 无码精品一区二区三区免费视频 | 国产在线观看免费不卡| 一区免费在线观看| 噼里啪啦免费观看高清动漫4| 国精无码欧精品亚洲一区| 美女视频黄视大全视频免费的| 免费阿v网站在线观看g| 亚洲精品av无码喷奶水糖心| 美丽的姑娘免费观看在线播放 | 国产精品另类激情久久久免费| 日韩一区二区三区免费播放| 久久精品九九亚洲精品天堂| 成人嫩草影院免费观看| 香蕉视频在线观看亚洲| 黄a大片av永久免费| 亚洲香蕉久久一区二区三区四区| 免费久久人人爽人人爽av| 亚洲一级片内射网站在线观看|