<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)  編輯  收藏


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


    網站導航:
     
    主站蜘蛛池模板: 四虎影视久久久免费观看| 亚洲av无码专区亚洲av不卡| 一级中文字幕乱码免费| 四只虎免费永久观看| 久久国产免费观看精品3| 国产精品免费视频网站| 亚洲AV无码一区二区三区系列 | 久久久国产精品亚洲一区| 久久国产精品国产自线拍免费| 久久亚洲国产中v天仙www| a在线观看免费网址大全| 曰曰鲁夜夜免费播放视频| 亚洲国产精品尤物YW在线观看 | 免费看无码特级毛片| 亚洲国产精品热久久| 牛牛在线精品观看免费正| 免费一本色道久久一区| 亚洲欧美aⅴ在线资源| 免费大香伊蕉在人线国产| 黑人精品videos亚洲人| 在线看片免费人成视久网| 亚洲国产品综合人成综合网站| 久久久久久久久久久免费精品| 久久久久国色AV免费观看性色| 色九月亚洲综合网| 妞干网在线免费观看| 免费人成视频在线观看免费| 亚洲日韩精品一区二区三区无码 | 粉色视频在线观看www免费| 亚洲日韩VA无码中文字幕| 日韩精品无码一区二区三区免费| 亚洲国产精品综合久久2007| 暖暖在线视频免费视频| 亚洲乱码国产乱码精品精| 亚洲综合免费视频| 美女免费视频一区二区三区| 亚洲日韩精品一区二区三区无码| 国产成人精品久久免费动漫| 免费播放国产性色生活片| 337p日本欧洲亚洲大胆精品555588| 久热中文字幕在线精品免费|