<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)計(jì)

    留言簿(3)

    閱讀排行榜

    評(píng)論排行榜

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

    ?

    Persistence Manager Factory

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


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

    下面是這個(gè)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.

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

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

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


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: aⅴ在线免费观看| 亚洲国产精品尤物yw在线| 2021久久精品免费观看| 四虎成人免费大片在线| 亚洲va在线va天堂成人| 国产麻豆视频免费观看| 亚洲人精品亚洲人成在线| 一级毛片aa高清免费观看| 亚洲国产综合无码一区二区二三区| 亚洲人AV在线无码影院观看| 成年轻人网站色免费看| 精品亚洲综合在线第一区| 免费无码又爽又刺激高潮软件 | a级毛片黄免费a级毛片| 久久亚洲中文字幕精品一区| 2022国内精品免费福利视频| 丁香花免费高清视频完整版 | 亚洲av日韩aⅴ无码色老头| 小小影视日本动漫观看免费| 狼人大香伊蕉国产WWW亚洲| 免费人成视频在线观看网站| 亚洲精品国产福利片| 精品免费久久久久国产一区| 亚洲精品乱码久久久久久蜜桃不卡| 亚洲欧美aⅴ在线资源| 国产一区二区三区免费在线观看 | 精品视频一区二区三区免费| 亚洲视频在线观看不卡| 四虎成人免费网站在线| 一级毛片免费一级直接观看| 亚洲视频一区调教| 三年片免费高清版 | 日韩免费一区二区三区在线播放 | 亚洲韩国—中文字幕| 国产日本一线在线观看免费| 噜噜噜亚洲色成人网站| 国产l精品国产亚洲区在线观看| 久草视频免费在线观看| 黄色一级视频免费| 免费a级毛片高清视频不卡| 免费的黄色的网站|