<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企業應用,Portal,WebService,WorkFlow,GIS.

    統計

    留言簿(3)

    閱讀排行榜

    評論排行榜

    Java數據持久層 - Persistence Manager Factory

    ?

    Persistence Manager Factory

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


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


    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. 改用抽象工廠方法, 一套持久層產品提供一個工廠,用于創建不同的產品(如:PersistenceManager,Transaction....)

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

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


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


    網站導航:
     
    主站蜘蛛池模板: 国产a不卡片精品免费观看| 亚洲伊人精品综合在合线| 成人黄动漫画免费网站视频 | 美女黄色毛片免费看| 国产亚洲综合久久| 国产高清不卡免费视频| 亚洲精品视频免费看| 免费一区二区三区四区五区| 亚洲国产精品一区二区成人片国内| 国产亚洲一区二区精品| 亚洲人成免费电影| 国产成人免费爽爽爽视频| 亚洲人成色777777在线观看| 久久精品国产亚洲av麻豆蜜芽 | 国产线视频精品免费观看视频| 一个人看的www在线观看免费| 久久久久亚洲?V成人无码| 亚洲国产超清无码专区| 免费精品视频在线| 日韩一区二区a片免费观看 | 亚洲av无码片在线观看| 天天摸天天操免费播放小视频| 亚洲AV乱码久久精品蜜桃| 美女羞羞喷液视频免费| 亚洲色婷婷综合开心网| 亚洲av无码兔费综合| 久久精品免费一区二区| 伊伊人成亚洲综合人网7777| 亚洲av纯肉无码精品动漫| 亚洲国产一区明星换脸| 亚洲色偷偷偷综合网| 日本免费一区二区三区| 亚洲乱亚洲乱妇无码麻豆| 1000部免费啪啪十八未年禁止观看 | 成年大片免费视频| 人人爽人人爽人人片av免费| 成年人视频在线观看免费| 人成午夜免费大片在线观看| 久久久久亚洲AV无码专区首JN| 皇色在线免费视频| 免费国产成人午夜私人影视 |