在應用程式中將OJB作為一個儲存層使用(三) (轉)

gugu99發表於2007-08-17
在應用程式中將OJB作為一個儲存層使用(三) (轉)[@more@]

如果在product表中有10000條記錄,那麼從庫中獲得所有得記錄是一個很費時的操

作,每個記錄都必須新建一個,整個表都要讀入。在示例中,沒有考慮性

能問題,但是在一個實際的應用OJB的程式中,我們需要一個更有效的方法來獲得所有記

錄,如果你的程式不需要將整個表調入記憶體,那麼建議你使用getIteratorByQuery()方

法來返回Iterator而不返回Collection。

如果你需要遍歷較大的結果集,這種方法很實用。所有例項並不是一次性被建立,只是

在你"需要"的時候才分配記憶體。不再使用的儲存結構例項可以被garbage collecto

r重新回收。下面就是使用這種方法的例項程式碼:

public void apply()

{

  System.out.println("The list of available products:");

  // build a query that all s of Class Product,

  // without any further criteria according to ODMG

  // the Collection containing all

  // instances of a persistent class is called "Extent"

  Query query = new QueryByCriteria(Product.class, null);

  try

  {

  // ask the broker to retrieve an Iterator

  .util.Iterator iter = broker.getIteratorByQuery(query);

  // now iterate over the result to print each product

  while (iter.hasNext())

  {

  System.out.println(iter.next());

  }

  }

  catch (Throwable t)

  {

  t.printStackTrace();

  }

}

更詳細的說明可以參考PersistenceBroker JavaDoc和Query Doc。

儲存物件:

現在讓我們來看看UCEnterNewProduct類。它是這樣來工作的:首先,它建立一個新的對

象,然後要求使用者輸入新產品的相關資料(產品名稱,價格,庫存量)。這些資料被存

儲在新物件中。然後我們必須把新建立的物件存到儲存庫中。我們可以使用Persistenc

eBroker.store(Object ojb):

public void apply()

{

  // this will be our new object

  Product newProduct = new Product();

  // now read in all relevant information and fill the new object:

  System.out.println("please enter a new product");

  String in = readLineWithMessage("enter name:");

  newProduct.setName(in);

  in = readLineWithMessage("enter price:");

  newProduct.setPrice(Double.parseDouble(in));

  in = readLineWithMessage("enter available stock:");

  newProduct.setStock(Integer.parseInt(in));

  // now perfopersistence operations

  try

  {

  // 1. open transaction

  broker.beginTransaction();

  // 2. make the new object persistent

  broker.store(newProduct);

  broker.commitTransaction();

  }

  catch (PersistenceBrokerException ex)

  {

  // if something went wrong: rollback

  broker.abortTransaction();

  System.out.println(ex.getMessage());

  ex.printStackTrace();

  }

}

可能你已經發現了,我們並沒有新產品的主鍵id賦值。OJB能夠檢查到一個新產品的id沒

有被設定而自動制定一個唯一的id值。Id值的自動增長是在Repository-中定義的。

 

物件:

當使用者相編輯一個產品的時候(透過從目錄中選擇2),使用者必須輸入想編輯產品的id值

。因為程式沒有維護著產品物件表,必須首先透過PersistenceBroker從儲存庫中得

到一個產品。

透過PersistenceBroker選擇一個物件很簡單――我們必須首先建立一個QueryByCriter

ia物件。QueryByCriteria物件含有使用者輸入的id值資訊,你可能發祥我們並不需要產品

的其他資訊,我們只需要對productId設定過濾器就行了。直接構建一個Criteria物件可

以讓你申明一個複雜的條件如productId值必須大於2小於5。複雜的查詢在本文的後面將

介紹。

一旦透過broker.getObjectByQuery(query)方法獲得了Product物件,接下來就能夠透過

使用者輸入來修改物件屬性,然後透過broker.store(toBeEdited)將修改後的結構存入存

儲庫。下面是UCEditProduct類的有關程式碼:

public void apply()

{

  String in = readLineWithMessage("Edit Product with id:");

  int id = Integer.parseInt(in);

  // We do not have a reference to the selected Product.

  // So first we have to lookup the object,

  // we do this by a query by example (QBE):

  // 1. build an example object with matching primary key values:

  Product example = new Product();

  example.setId(id);

  // 2. build a QueryByCriteria from this sample instance:

  Query query = new QueryByCriteria(example);

  try

  {

  // 3. start broker transaction

  broker.beginTransaction();

  // 4. lookup the product specified by the QBE

  Product toBeEdited = (Product) broker.getObjectByQuery(query);

  // 5. edit the existing entry

  System.out.println("please edit the product entry");

  in = readLineWithMessage(

  "enter name (was " + toBeEdited.getName() + "):");

  toBeEdited.setName(in);

  in = readLineWithMessage(

  "enter price (was " + toBeEdited.getPrice() + "):");

  toBeEdited.setPrice(Double.parseDouble(in));

  in = readLineWithMessage(

  "enter available stock (was " +

  toBeEdited.getStock()+ "):");

  toBeEdited.setStock(Integer.parseInt(in));

  // 6. now ask broker to store the edited object

  broker.store(toBeEdited);

  // 7. commit transaction

  broker.commitTransaction();

  }

  catch (Throwable t)

  {

  // rollback in case of errors

  broker.abortTransaction();

  t.printStackTrace();

  }

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-963448/,如需轉載,請註明出處,否則將追究法律責任。

相關文章