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

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

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

    Martin's Java Architect Blog

    J2EE企業(yè)應(yīng)用,Portal,WebService,WorkFlow,GIS.

    統(tǒng)計

    留言簿(3)

    閱讀排行榜

    評論排行榜

    Java數(shù)據(jù)持久層 - Persistence Manager Factory

    ?

    Persistence Manager Factory

    昨天還在用Torque,今天聽說Hibernate更好,明天說不準又有更好的持久層工具...
    如何使應(yīng)用程序不變化的情況下選擇不同的持久層呢?
    看看Finetix LLC的資深顧問Charles Chan 給我們現(xiàn)身說法。


    Charles Chan 在文章 Object-Relational Mapping with Apache Jakarta OJB
    中介紹了Apache OJB的使用,并在文章附錄中提到一種屏蔽不同持久層的設(shè)計思路,他采用了工廠方法模式(Factory Method),并通過實例Apache OJB來說明他的設(shè)計。
    這個設(shè)計有兩個產(chǎn)品,一個是PersistenceManager,另一個是Transaction 。
    OJBPersistenceManager和OJBTransaction 分別是兩個產(chǎn)品的實現(xiàn)。


    It is often desirable to decouple your application from the specifics of a persistence framework, so that you can easily switch frameworks in the future. I recommend creating custom PersistenceManager and Transaction classes for this purpose. For example:

    Example? 13 :?PersistenceManager?and?Transaction?Interfaces
    /**
    *?The?abstract?base?class?for?all?PersistenceManager.?It?provides
    *?method?to?persist?and?object?and?to?obtain?the?current
    *?transaction.
    */

    public ? abstract ? class ?PersistenceManager
    {
    public ? static ?PersistenceManager?getInstance()
    {
    return ? new ?OJBPersistenceManager();
    }
    ?

    public ? abstract ? void ?makePersistent(Object?o)
    throws ?PersistenceException;?

    public ? abstract ?Transaction?currentTransaction()
    throws ?PersistenceException;?

    }
    ?


    /**
    *?A?Transaction?interface.?It?provides?minimal?support?for
    *?beginning,?committing,?and?rolling?back?a?transaction.
    */

    public ? interface ?Transaction
    {
    public ? void ?begin()? throws ?PersistenceException;?

    public ? void ?commit()? throws ?PersistenceException;?

    public ? void ?rollback()? throws ?PersistenceException;
    }
    ?


    /**
    *?An?OJB?specific?implementation?of?the?PersistenceManager
    *?class.
    */

    public ? class ?OJBPersistenceManager? extends ?PersistenceManager
    {
    private ?PersistenceBroker?broker? = ? null ;?

    public ?OJBPersistenceManager()
    {
    broker?
    = ?PersistenceBrokerFactory.defaultPersistenceBroker();
    }
    ?

    public ? void ?makePersistent(Object?o)? throws ?PersistenceException
    {
    try
    {
    broker.store(o);
    }

    catch ?(PersistenceBrokerException?e)
    {
    // ?rethrow?PersistenceException
    }

    }
    ?

    public ?Transaction?currentTransaction()? throws ?PersistenceException
    {
    return ? new ?OJBTransaction(broker);
    }

    }
    ?


    ?


    /**
    *?An?OJB?specific?implementation?of?the?Transaction
    *?interface.
    */

    public ? class ?OJBTransaction? implements ?Transaction
    {
    private ?PersistenceBroker?broker? = ? null ;?

    public ?OJBTransaction(PersistenceBroker?broker)
    {
    this .broker? = ?broker;
    }
    ?

    public ? void ?begin()? throws ?PersistenceException
    {
    try
    {
    broker.beginTransaction();
    }

    catch (TransactionAbortedException?e)
    {
    // ?rethrow?PersistenceException
    }

    catch (TransactionInProgressException?e)
    {
    // ?rethrow?PersistenceException
    }

    }
    ?

    public ? void ?commit()? throws ?PersistenceException
    {
    try
    {
    broker.commitTransaction();
    }

    catch (TransactionAbortedException?e)
    {
    // ?rethrow?PersistenceException
    }

    catch (TransactionNotInProgressException?e)
    {
    // ?rethrow?PersistenceException
    }

    }
    ?

    public ? void ?rollback()? throws ?PersistenceException
    {
    try
    {
    broker.abortTransaction();
    }

    catch (TransactionNotInProgressException?e)
    {
    // ?rethrow?PersistenceException
    }

    }

    }
    ?


    After the above classes are created, it is very simple to convert the test application to use them:

    下面是這個Factory的使用:

    Example? 14 :?Example?Using?PersistenceManager?and?Transaction?Interfaces
    PersistenceManager?pm?
    = ?PersistenceManager.getInstance();
    Transaction?tx?
    = ?pm.currentTransaction();?

    tx.begin();
    Manager?manager?
    = ?newManager();
    manager.setName(
    " John?Smith " );
    manager.setProjectNumber(
    new ?Integer( 10 ));?

    pm.makePersistent(manager);?

    Employee?employee?
    = ?newEmployee();
    employee.setName(
    " David?Cosby " );?

    pm.makePersistent(employee);?

    tx.commit();?


    It looks surprisingly like JDO, doesn't it? With a little more effort, you can also hide the OJB query mechanism.

    改進建議:
    1. 改用抽象工廠方法, 一套持久層產(chǎn)品提供一個工廠,用于創(chuàng)建不同的產(chǎn)品(如:PersistenceManager,Transaction....)

    2.考慮從不同的持久層產(chǎn)品中抽取一套通用的持久層接口

    posted on 2007-03-13 21:04 martin.liu 閱讀(852) 評論(0)  編輯  收藏


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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 色www永久免费视频| 香港a毛片免费观看| 狠狠热精品免费观看| 一级成人a做片免费| 无码国产精品一区二区免费vr| 国产三级电影免费观看| 久久青青草原亚洲av无码app| 亚洲精品永久在线观看| 中文字幕乱码系列免费| 免费的涩涩视频在线播放| 亚洲熟妇AV乱码在线观看| 久久久久久AV无码免费网站下载 | 国产偷伦视频免费观看| 妞干网在线免费观看| 久久精品九九亚洲精品天堂| 国产精品亚洲综合久久| 日本高清高色视频免费| 免费v片在线观看无遮挡| 亚洲国产美女在线观看| a级毛片毛片免费观看久潮喷| 免费A级毛片在线播放不收费| 思思久久99热免费精品6| 一二三四影视在线看片免费| 亚洲国产精品无码中文字| 99久9在线|免费| 国产美女亚洲精品久久久综合| 亚洲永久在线观看| 久久久久久夜精品精品免费啦| 国产伦一区二区三区免费| 四虎影视永久在线精品免费| 亚洲精品你懂的在线观看| 99re8这里有精品热视频免费 | 亚洲人成在线精品| 国产精品99久久免费观看| 亚洲国产精品午夜电影| 免费在线黄色网址| 免费国产99久久久香蕉| 亚洲欧美日韩国产精品一区| 久久亚洲av无码精品浪潮| 日亚毛片免费乱码不卡一区 | 最近的免费中文字幕视频|