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

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

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

    kapok

    垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      455 隨筆 :: 0 文章 :: 76 評論 :: 0 Trackbacks

    http://www.huihoo.com/development/oo/castor.html

     

    castor概述


    (by huihoo.com reimon)

    Castor是ExoLab Group下面的一個開放源代碼的項目,它主要實現(xiàn)的是O/R映射功能。它主要API和數(shù)據(jù)接口為:JDO-like, SQL, OQL, JDBC, LDAP, XML, DSML。它支持分布式目錄事務處理和時間;提供處理XML、Directory、XADirectory的類庫,提供從XML到JAVA類的轉(zhuǎn)換機制。

    上面這段是網(wǎng)上的一段評論,大概介紹了Castor的一些特性,我們需要注意的是,Castor所提供的是Castor JDO,而不是SUN所提供的JDO規(guī)范(JSR000012),所以在上面的評論中使用了JDO-like這樣的評語,在后面我們會進一步討論這個問題的。

    呵呵,不過在我看來,Castor對我們的意義,最重要的就是其XML映射機制和其獨創(chuàng)的Castor JDO的機制了。下面我會分別就這兩個問題加以介紹:

    一、Castor XML

    我們可以認為這是一個獨立的Framework,專門負責與XML打交道。在了解眾多的類和API之前,我們有必要了解其整體的構(gòu)建思想。在OOP中,我們都知道,對象是類的實體化,我們也知道,在OP中所要完成的工作是將對象持久保存下來,那么相對的,我們同樣可以用類似的方法將類的定義和信息也保存下來,這是否可以稱為CP呢?呵呵,不管叫什么名字,在Castor中的XML處理中,就是根據(jù)這樣的思想完成了兩個獨立的功能塊,一塊負責類到XML的保存和加載,另一塊負責對象到XML的保存和加載。具體的構(gòu)造我們可以參看下圖:


    如上圖所描述的,marshaller和unmarshaller負責對象和XML文件間的轉(zhuǎn)換。這種轉(zhuǎn)換過程主要在服務器端完成。在運行中,客戶端的請求發(fā)送到服務器端后,對內(nèi)存中的對象進行相應操作,然后將處理完畢的對象marshall成為XML文件,或者進一步將XML文件格式化為HTML文件發(fā)送到客戶端。如果以XML文件格式發(fā)送到客戶端,那么在客戶端實行unmarshall操作將XML文件還原為內(nèi)存中的對象,這樣就完成了交互過程。


    至于source generator則和TOPLINK中實現(xiàn)的相類似,不過它沒有提供可視化的XML Schema的工具而已。我們編寫好描述類結(jié)構(gòu)的XML文件,然后運行Castor提供的source generator就可以自動生成JAVA代碼了。有趣的是,它自動生成的代碼和BEAN的風格很類似,很容易看懂。

    對于XML而言,只要把握了這樣的整體,其他的諸如代碼生成中的兩種模式、映射規(guī)范、數(shù)據(jù)結(jié)構(gòu)問題等細節(jié)問題就很簡單了,在文檔中附有很實用的例子和解釋,這里就不再多說了。

    二、Castor JDO

    要了解JDO首先要認識兩個基本的問題:

    1、和SUN JDO的關(guān)系

    Castor JDO和SUN JDO并不相同,Castor JDO是獨立于SUN JDO發(fā)展起來的,但是它們所完成的工作非常相似。雖然也可以將Castor JDO重新定制成SUN JDO那個樣子,但是由于兩者在鎖定策略上存在的根本差異,這樣做并不劃算。在內(nèi)部,Castor JDO為所有事務中的每個活動的持久性對象只維護一份鎖定(和緩存)的備份。而在SUN中則對每個事務中的每個持久性對象各維護一個備份,并且SUN JDO還需要字節(jié)碼編輯器,而CastorJDO并不需要。Castor還提供了其他的一些特性,比如說key generators,long transaction support 以及 OQL query,這些都在SUN的JSR中是看不到的。所以我們在前面對Castor的評價是JDO-LIKE的。

    2、和EJB的關(guān)系

    Castor和EJB很難說誰更好一些。

    一個實體Bean可以管理它自身的持久化。它要么調(diào)用BMP(Bean Managed Persistence)來自己管理持久化,要么就依靠它的容器的CMP(Container Managed Persistence)來做到持久化。

    對于BMP來說,一個實體BEAN可以使用Castor JDO作為它的持久化機制,也可以使用其他的機制,比如說直接調(diào)用JDBC。

    對于CMP來說,一個EJB Container可以將它們的CMP基于Castor JDO來實現(xiàn),那么Castor JDO將被用來將實體BEAN持久化。如果開發(fā)者需要EJB的life-cycle管理, , "write once deploy anywhere" 和其他分布式應用程序的優(yōu)點,那么建議你直接使用EJB。否則,使用Castor將會更簡單,而且還開放源代碼,開銷更小,并提供更多的設(shè)計自由性,以及所提供的集成的XML支持。我們應當根據(jù)實際情況來選擇所使用的機制。

    具體的使用我就不知道怎么說了,呵呵,下面把它的一個概括性介紹的文檔給翻譯了下來,Castor JDO的一些基本的使用特性里面基本上都介紹或者提及了,比如說JDO的兩種使用環(huán)境的區(qū)別、OQL query、生存期問題、基本語義、與XML聯(lián)用等,如果需要更具體的情況請自行查詢Castor的文檔。

    <翻譯來自castor的聯(lián)機文檔--Castor JDO概況>

    打開一個JDO數(shù)據(jù)庫

    CatorJDO支持兩種類型的環(huán)境,客戶端應用程序和J2EE服務器??蛻舳藨贸绦蜇撠熢O(shè)置數(shù)據(jù)庫連接和管理事務處理。J2EE應用程序使用JNDI來獲取預先配置好的數(shù)據(jù)庫連接,并且使用UserTransaction或者CMT(container managed transaction)來管理事務。如果你在這兩種環(huán)境中用過JDBC,那么你對它們之間的異同會很了解。

    客戶端應用程序

    客戶端應用程序負責設(shè)置數(shù)據(jù)庫連接和管理事務處理。數(shù)據(jù)庫的設(shè)置是通過一個與映射文件相連接的獨立的XML文件來實現(xiàn)的。在例子中就是database.xml,但是其實我們可以使用任何的名字。

    org.exolab.castor.jdo.JDO定義了數(shù)據(jù)庫的名字和屬性,并被用來打開一個數(shù)據(jù)庫連接。通過使用setConfiguration命令來指定配置文件URL,我們可以裝載數(shù)據(jù)庫的配置。使用同一個配置來創(chuàng)建多個JDO對象只會裝載配置文件一次。 org.exolab.castor.jdo.Database對象實現(xiàn)了到數(shù)據(jù)庫的開放連接。在定義里,database對象不是thread safe因而不應該用于并發(fā)進程中。當開啟多個Database對象是會有一點開銷,并且JDBC連接is acquired only per open transaction。下面的代碼片顯示了在典型的客戶端應用程序中的打開一個數(shù)據(jù)庫,運行一個事務,然后關(guān)閉數(shù)據(jù)庫的過程。

    JDO jdo;
    Database db;

    // 定義JDO對象
    jdo = new JDO();
    jdo.setDatabaseName( "mydb" );
    jdo.setConfiguration( "database.xml" );
    jdo.setClassLoader( getClass().getClassLoader() );

    // 獲取一個新的數(shù)據(jù)庫

    db = jdo.getDatabase();

    // 開始事務處理
    db.begin();

    // 事務過程
    . . .

    // 提交事務,關(guān)閉數(shù)據(jù)庫
    db.commit();
    db.close();

    J2EE 程序( 不太懂,所以沒譯,大概說的是在J2EE中由于使用持久化方式的不通而產(chǎn)生的編碼不同的問題,可以參考一下我們前面對EJB持久化問題的探討)

    Note: We are now working on supporting Castor inside a J2EE container. Stay tuned for more information. J2EE applications depend on the J2EE container (Servlet, EJB, etc) to configure the database connection and use JNDI to look it up. This model allows the application deployer to configure the database properties from a central place, and gives the J2EE container the ability to manage distributed transactions across multiple data sources. Instead of constructing a org.exolab.castor.jdo.JDO the application uses the JNDI namespace to look it up. We recommend enlisting the JDO object under the java:comp/env/jdo namespace, compatible with the convention for listing JDBC resources.

    下面的代碼片使用JNDI來查找一個數(shù)據(jù)庫,并且使用UserTransaction來進行事務管理:

    InitialContext ctx;
    UserTransaction ut;
    Database db;

    // 在JNDI中查找數(shù)據(jù)庫
    ctx = new InitialContext();
    db = (Database) ctx.lookup( "java:comp/env/jdo/mydb" );

    // 開始事務處理
    ut = (UserTransaction) ctx.lookup( "java:comp/UserTransaction" );
    ut.begin();

    // 事務過程
    . . .

    // 提交事務,關(guān)閉數(shù)據(jù)庫
    ut.commit();
    db.close();

    When the transaction is managed by the container, a common case with EJB beans and in particular entity beans, there is no need to being/commit the transaction explicitly. Instead the application server takes care of enlisting the database in the ongoing transaction and commiting/rollingback at the proper time.

    The following code snippet relies on the container to manage the transaction:

    InitialContext ctx;
    UserTransaction ut;
    Database db;

    // Lookup databse in JNDI
    ctx = new InitialContext();
    db = (Database) ctx.lookup( "java:comp/env/jdo/mydb" );

    // Do something
    . . .

    // Close the database
    db.close();

    總結(jié):開啟一個數(shù)據(jù)庫在客戶端和在服務器端是有區(qū)別的,主要體現(xiàn)在事務處理的過程、配置問題等上面,需要注意。

    使用JDO數(shù)據(jù)庫
    臨時對象和持久對象
    所有的JDO操作都發(fā)生在事務中。事務提交時,JDO將數(shù)據(jù)從數(shù)據(jù)庫中加載到內(nèi)存中的對象中,讓應用程序?qū)ο筮M行操作,然后再將對象的新狀態(tài)存儲到數(shù)據(jù)庫中。所有的對象可以是兩種狀態(tài):臨時的或者持久的。
    臨時的:指當事務提交時狀態(tài)不會被保存的對象。對對象的修改不會表現(xiàn)在數(shù)據(jù)庫中。
    持久的:指當事務提交時狀態(tài)將被保存的對象。對對象的修改將反映在數(shù)據(jù)庫中。
    在下面情況下對象為持久的: 1、一個查詢的結(jié)果,
    2、使用create(java.lang.Object)或者update(java.lang.Object)將它加入到數(shù)據(jù)庫中。
    所有不是持久性的對象就是臨時性對象,當事務提交或者回滾時,所有的持久性對象變成臨時對象。
    在客戶端程序中,使用begin(),commit()和rollback()來管理事務。在J2EE程序中,JDO依靠container來含蓄或明確(基于bean的transaction屬性值)的使用javax.transaction.UserTransaction接口來管理事務。
    如果一個持久對象在事務中被改變了,在提交時修改會存入數(shù)據(jù)庫。如果事務回滾,數(shù)據(jù)庫不會被改變。如果要在兩個不同的事務中使用同一個對象,你必須重新查詢。
    對象的臨時和持久是從事務所屬的數(shù)據(jù)庫的角度來看的。一般來說持久對象只是對于一個數(shù)據(jù)庫而言,如果在另外一個數(shù)據(jù)庫中調(diào)用isPersistent(java.lang.Object)將返回false。當然也可以讓一個持久對象對應于兩個數(shù)據(jù)庫,比如說在一個數(shù)據(jù)庫中運行查詢,而在另一個數(shù)據(jù)庫中創(chuàng)建它。
    OQLQuery
    OQL查詢被用來從數(shù)據(jù)庫中查詢和尋找對象。OQL查詢和SQL查詢類似,但是使用對象名稱而不是SQL名稱,并且不需要join子句。比如說,如果類型為TestObject的對象被加載了,OQL查詢將使用“FROM TestObject”,而不管到底表名為什么。如果加載關(guān)聯(lián)的對象需要join,Castor將自動實現(xiàn)連接。
    下面的代碼片使用OQL查詢來加載指定組中所有的對象。注意產(chǎn)品和組是關(guān)聯(lián)的對象,JDBC查詢使用了連接:

    OQLQuery oql; QueryResults results;

    // Construct a new query and bind its parameters
    oql = db.getOQLQuery( "SELECT p FROM Product p WHERE Group=$" );
    oql.bind( groupId );

    // Retrieve results and print each one
    results = oql.execute();
    while ( results.hasMore() ) {
    System.out.println( results.next() );
    }

    下面的代碼片使用前面的查詢來獲得產(chǎn)品,將它們的價格減少25%,并且將它們存會數(shù)據(jù)庫(在這里使用了客戶端程序事務):
    while ( results.hasMore() ) {
    Product prod;
    prod = (Product) results.next();
    prod.markDown( 0.25 );
    prod.setOnSale( true );
    }

    // Explicitly commit transaction
    db.commit();
    db.close();

    如上面所描述的,查詢分三個步驟實現(xiàn):一、使用OQL語法從數(shù)據(jù)庫中創(chuàng)建一個query對象;二、如果有參數(shù),就將參數(shù)綁定到查詢中。參數(shù)綁定的順序和它們在OQL語法中出現(xiàn)的順序保持一致;三、執(zhí)行查詢并獲得一系列為org.exolab.castor.jdo.QueryResults的對象。查詢創(chuàng)建一次后可以多次使用,不過每次都得重新綁定參數(shù)。查詢再次執(zhí)行后,上一次的結(jié)果集可以繼續(xù)使用。參考下面的代碼來調(diào)用存儲過程:
    oql = db.getOQLQuery( "CALL sp_something($) AS myapp.Product" ); 在這里sp_something是一個返回一個或多個結(jié)果集的存儲過程,字段順序和前面相同(對于沒有關(guān)聯(lián)的對象,順序為:標識符,接下來是所有其他的字段,順序和mapping.xml中定義的順序一致)。
    Create/remove/update
    create(java.lang.Object)方法在數(shù)據(jù)庫中創(chuàng)建一個新的對象,或者在JDO terminology中使得一個臨時對象持久化。如果事務被提交的話,這個使用create方法創(chuàng)建的對象將保持在數(shù)據(jù)庫中,否則將被刪除。如果使用數(shù)據(jù)庫中已經(jīng)存在的標識來創(chuàng)建對象,將會產(chǎn)生一個異常。 下面的代碼片為先前查詢出來的一個組創(chuàng)建了一個新的產(chǎn)品:

    Product prod;
    // Create the Product object
    prod = new Product();
    prod.setSku( 5678 );
    prod.setName( "Plastic Chair" );
    prod.setPrice( 55.0 );
    prod.setGroup( furnitures );

    // Make is persistent
    db.create( prod );

    remove(java.lang.Object)方法產(chǎn)生相反的效果,它將刪除一個持久性對象。一旦刪除,任何事務都無法使用該對象。如果事務提交,這個對象將從數(shù)據(jù)庫中刪除,否則對象將仍然存在于數(shù)據(jù)庫中。如果試圖刪除一個非持久性對象,將產(chǎn)生異常。

    使用 JDO 和 XML

    CastorJDO和CastorXML結(jié)合起來,可以通過使用XML作為輸入和輸出來實現(xiàn)事務性數(shù)據(jù)庫操作。下面的程序片使用持久性和臨時性對象的結(jié)合來描述一個財務操作。

    這個例子獲取了兩個account對象并且從其中一個轉(zhuǎn)移了一筆金額到另外一個賬戶。轉(zhuǎn)移被描述為使用一個臨時對象(比如說無數(shù)據(jù)庫中的記錄),這個對象接下來被用于生成一個XML文檔來描述這次轉(zhuǎn)移過程。另外還有一個附加的過程(這里沒有表現(xiàn)出來),是使用XSLT來將XML文檔轉(zhuǎn)換為一個HTML頁面。

    Transfer tran;
    Account from;
    Account to;
    OQLQuery oql;
    tran = new Transfer();

    // Construct a query and load the two accounts
    oql = db.getOQLQuery( "SELECT a FROM Account a WHERE Id=$" );
    oql.bind( fromId );
    from = oql.execute().nextElement();
    oql.bind( toId );
    to = oql.execute().nextElement();

    // Move money from one account to the other
    if ( from.getBalance() >= amount ) {
    from.decBalance( amount );
    to.incBalance( amount );
    trans.setStatus( Transfer.COMPLETE );
    trans.setAccount( from );
    trans.setAmount( amount );
    } else {

    // Report an overdraft
    trans.setStatus( Transfer.OVERDRAFT );
    }

    // Produce an XML describing the transfer
    Marshaller.marshal( trans, outputStream );
    The XML produced by the above code might look like:



    Completed




    總結(jié):在使用數(shù)據(jù)庫的過程中,我們需要區(qū)分好臨時對象和持久對象,并掌握靈活運用它們的方法,另外,Castor所支持的OQL的用法也值得研究,我們可以參考Castor所提供的詳細文檔進一步了解。
    posted on 2005-06-13 22:00 笨笨 閱讀(276) 評論(0)  編輯  收藏 所屬分類: J2EE 、ALL
    主站蜘蛛池模板: 国产亚洲人成网站在线观看| 亚洲字幕在线观看| 久久精品毛片免费观看| 亚洲精品人成网在线播放影院| 又粗又硬免费毛片| 一级毛片免费毛片一级毛片免费| 色老板亚洲视频免在线观| 国产成人精品久久亚洲高清不卡 | 99爱在线观看免费完整版| 欧美亚洲精品一区二区| 久久亚洲国产精品五月天| 成人毛片18女人毛片免费| 色www永久免费网站| 亚洲丁香婷婷综合久久| 亚洲va在线va天堂va四虎| 亚洲 综合 国产 欧洲 丝袜| 日韩精品免费一级视频| 精品一区二区三区高清免费观看 | 蜜桃成人无码区免费视频网站 | 高清永久免费观看| 亚洲国产成人AV在线播放| 亚洲第一福利视频| 亚洲阿v天堂在线2017免费| 青青青国产在线观看免费网站| 精品乱子伦一区二区三区高清免费播放| 国产成人亚洲合集青青草原精品 | 国产精品国产免费无码专区不卡| 久久久久成人片免费观看蜜芽 | 在线亚洲97se亚洲综合在线| 成人免费在线观看网站| 免费女人高潮流视频在线观看| 人与动性xxxxx免费| 亚洲区日韩精品中文字幕| 亚洲精品在线免费观看| 亚洲乱码中文字幕久久孕妇黑人| 真实乱视频国产免费观看| 一二三四影视在线看片免费| 日韩精品无码一区二区三区免费| 国产精品免费观看视频| 亚洲精品欧美综合四区| 亚洲依依成人亚洲社区|