kodojdo指南第六章

 第六章 JDOHelper

  上圖列出了JDOHelper最常用的方法。詳細的API信息請參考類的Javadoc文檔
  應用程序使用JDOHelper進行三類操作:能持久化操作,生存期操作和創建PersistenceManagerFactory

。我們逐一研究。

6.1 能持久化操作
 
  前兩個操作makeDirty和getObjectId我們已經見過。假設一個能持久化對象和字段名被修改,

makeDirty 方法會告訴JDO字段值已經改變,將新值寫到數據存儲中去。通常JDO自動跟蹤字段的修改,你使

用這個方法的唯一機會是你想賦新值給數組索引時。
  getObjectId 方法返回JDO標誌對象,這個方法要求以持久類實例作爲參數。如果該實例的類不是持久的

,那麼這個方法返回null
  顧名思義,getPersistenceManager以能持久類作爲參數,得到管理這個持久類的PersistenceManager

。如果參數實例是非持久的,返回null


6.2 生存期操作

  JDO能識別能持久類的幾種生存期狀態。在JDO規範規定實例的狀態轉換遵守嚴格的規則。狀態轉換可以被

顯式的行爲觸發,例如調用PersistenceManager的deletePersistent 方法刪除某個持久對象,也能被隱

式行爲觸發,例如讀取某個持久字段。
  下面列出能持久類實例的生存期狀態。除非特別聲明,每種狀態都能被所有JDO實現品支持。別在意你能不

能記住狀態和轉換行爲,實踐中你很少會考慮到他們。

 1)Transient:通過自定義構造函數創建而沒有和持久框架關聯的對象稱爲暫時性對象。如果沒有JDO,那

麼對象就是暫時性對象。
 2)Persistent-new:對象調用PersistenceManager.makePersistent方法使自身持久而又沒有插入到

數據存儲中的狀態稱爲“新持久”狀態。當對象轉換爲這個狀態的時候,會得到一個JDO標識。
    在事務提交時,新持久狀態對象的信息會插入到數據存儲。事務回滾時,一個新持久實例回覆暫時性狀態

。數據存儲不起作用。如果事務的RestoreValues屬性賦值爲true,實例的持久事務化字段會回覆事務剛開

始時的值。
 3)Persistent-new-deleted:在當前事務,對象剛由PersistenceManager.makePersistent創建或由

PersistenceManager.deletePersistent刪除會進入這個狀態。此時你只能訪問對象的主鍵字段。如果試

圖訪問其他持久字段,會返回JDOUserException

  在事務提交時,處於persistent-new-deleted 狀態的對象會轉爲暫時狀態。其持久性字段的值會被JAVA

的默認值替代。事務回滾是,處於persistent-new-deleted 狀態的對象也會轉爲暫時狀態,在這種情況下

,如果事務的RestoreValues 屬性設爲true,它持久事務性的字段值會回覆到事務剛開始時那樣。否則不改

變。

  4)Persistent-clean:在當前事務中持久性字段未作出改變的對象所表現的狀態稱爲

Persistent-clean

  5)Persistent-dirty:當前事務中持久性字段值改變的對象狀態稱爲Persistent-dirty。在事務提交

後,數據存儲會更新反映對象的持久性狀態。

  6)Persistent-deleted:如果某個持久化對象是PersistenceManager.deletePersistent對象的參

數,它就變爲PersistenceManager.deletePersistent的狀態。對象處於這個狀態時,你只能訪問它的主

鍵字段,訪問其他字段會導致JDOUserException。
  事務提交時處於persistent-deleted狀態的對象會轉爲暫時的。對象的存儲記錄已被清除。

  7)Hollow:未從數據存儲讀取值的持久對象處於Hollow狀態,只要實例進入Hollow狀態,它持久性字段

的值會被代之以JAVA默認值。當你第一次訪問這些字段的時候,這些字段會從數據存儲重新裝載,如果有必要

,可以延遲讀取信息的時間,這稱爲懶惰裝載。
  JDO實現品對處於Hollow狀態實例的跟蹤是不牢固的,如果你的應用程序沒有保留對它們的引用,那麼它們

會被垃圾回收。

  8)Persistent-nontransactional:處於Persistent-nontransactional狀態的對象表現爲持久數據

在數據存儲裏,但不保證是最新的值。一個允許訪問數據舊值的狀態好像是沒用的,但如果使用得當,你會發

現當你引入程序的過時數據時,處於此狀態的對象能提供更好的性能。
  這個狀態是JDO的可選特性,有可能不被許多JDO實現品支持。這也是目前爲止最複雜的生存期,它由事務

的NontransactionalRead, NontransactionalWrite, RetainValues, 和Optimistic properties等

管理。當下節介紹PersistenceManagerFactory 屬性的時候,我們會討論這些屬性。
  在事務之外,讀寫處於Persistent-nontransactional狀態的持久字段不會導致狀態改變。當開始數據事

務時,你對這個實例的持久字段所作的任何修改都會被忽略。而當你在事務之內讀

Persistent-nontransactional狀態對象的持久字段則會轉換爲persistent-clean狀態,而寫則會轉化爲

persistent-dirty狀態。在最優事務內,讀不會轉化狀態,寫則會轉化爲persistent-dirty狀態。

  9)Transient-clean:Transient-clean和transient-dirty兩種狀態可以歸爲

transient-transactional類別,處於Transient-transactional狀態的對象並不持久化,不過它們的字段

可以作爲事務的邊界.意味着當事務回滾的時候它們可以回覆之前的值.通過把暫時性實例作爲參數,調用

PersistenceManager的makeTransactional 方法, 你可以使它變成Transient-transactional.一些

JDO廠商不支持transient-transactional 狀態,它是JDO規範的可選特性.

  10)Transient-dirty:處於Transient-transactional 狀態的實例在當前事務被修改則進入

transient-dirty
狀態,在事務完成之後,處於此狀態的對象會變成transient-clean.如果事務回滾和它的RestoreValues屬

性設爲true,那麼持久化和事務字段會回覆事務開始之前的值.

  下圖描述了持久化對象的狀態轉化.箭頭表示從一種狀態轉換爲另一種狀態.箭頭下的文字顯示了觸發狀態轉

換的事件.用紫色表示的方法名是事務接口裏的方法,用紅色表示的方法名是PersistenceManager 接口的方

法.等會我們會介紹這些接口.

  在複習完JDO生存期狀態之後,JDOHelper的生存期操作--isDirty, isTransactional,

isPersistent, isNew, isDeleted --的目的就完全清楚了.每個都告訴你能持久實例是否有如名字顯示的

那種屬性,這些屬性由實例的生存期狀態決定.事實上,根據下面的表格,你可以根據這些屬性計算出實例的狀態

.然而再次聲明,實踐中很少需要擔心你能持久化類的生存期狀態.


  6.3. PersistenceManagerFactory 構造函數

  你可以廠商無關的風格調用JDOHelper的getPersistenceManagerFactory 方法來獲得

PersistenceManagerFactory PersistenceManagerFactory 對象,這個方法需要一個參數:一個

java.util.Properties類的實例.這個實例的作用是設定PersistenceManagerFactory ,每次調用這個方

法,廠商都可以構造一個新的PersistenceManagerFactory 對象,或者返回連接池中匹配所提供屬性的

PersistenceManagerFactory 對象.可供使用的配置選項和相關屬性名稱會在下章討論.

發佈了34 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章