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

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

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

    編程生活

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      113 隨筆 :: 0 文章 :: 18 評論 :: 0 Trackbacks

    OpenJPA 是最新的嘗試,它能夠將對象繼承關系的持久化透明化,企業應用開發者僅需要處理對象模型,而不需要處理和關系型數據庫有關的內容,極大地降低了對象繼承關系持久化的難度。下面我們來了解 OpenJPA 中持久化對象繼承關系的幾種方式。

    持久化對象繼承關系的方式

    我們從關系數據庫角度看對象繼承關系的持久化這個問題域:對象繼承通常意味著子類比父類提供更多的屬性,持久化對象繼承關系的實質就是如何根據對象的類型動態的處理這些多出來的屬性。OpenJPA 框架支持使用三種不同的策略處理對象繼承關系:

    1. 類及其子類保存在一張數據庫表中

    在這種情況下,類及其子類都保存在同一張數據表中,該表提供足夠的字段保存類及其子類的所有屬性,同時提供一個特別字段保存當前記錄對應類的實際類名(默認名 DTYPE,也可以在開發時指定其它名稱)。在企業應用運行過程中,OpenJPA 框架根據 Java 對象的實際類型和數據庫表進行綁定。
    圖 1. Animal、Fish 和 Dog 對象模型
    圖 1. Animal、Fish 和 Dog 對象模型
    以上圖中提到的對象模型為例: Animal、Fish、Dog 三個類的所有對象實例都被保存在 Animal 數據表中,該表將會有 5 個屬性,其中 ID,NAME 字段對應 ANIMAL 類的兩個屬性,ID、NAME、SEX 對應 Dog 類的屬性,ID、NAME、STERRITORY 對應 Fish 類的屬性。DTYPE 是 OpenJPA 加入的字段,用于確定當前記錄的實際類類型,在這里例子中,它的內容是“ANIMAL”、“FISH”或者是“DOG”。


    圖 2. 第一種策略的數據庫表現
    圖 2. 第一種策略的數據庫表現

    2. 類和子類分別保存在不同的數據庫表中,互相之間沒有關聯

    這種情況下,開發者不理會類之間是否存在繼承關系,為每一個類的持久化使用唯一的表,父類對象保存在父類對應的表中,子類對象的信息保存在子類對應的表中,這也是通常的持久化框架采用的方式。下面這個圖顯示了這種情況下對象繼承關系數據庫中的表現。

    以上一章節中提到的對象模型為例: Animal、Fish、Dog 三個類的對象實例都被保存在各自對應的數據表中。下面這個圖顯示了這種情況下對象繼承關系數據庫中的表現。


    圖 3. 第二種策略的數據庫表現
    圖 3. 第二種策略的數據庫表現

    3. 類和子類分別保存在不同的數據庫表中,子類中不保存父類中已有的屬性,僅通過主鍵進行關聯

    這種情況下,父類和子類對應不同的表,但是子類對應的表中不再保存父類對應表中已經存在的字段信息,兩個表之間通過關鍵字段關聯起來,也就是數據庫技術中通常所說的外健。這種實現方式是最理想化的一種,既能夠處理對象之間的繼承,又滿足了關系數據庫中對于設計范式的要求。

    以上一章節中提到的對象模型為例: Animal、Fish、Dog 三個類的對象實例都被在 Animal 表中有記錄;而 Fish 對象的 TERRITORY 屬性者被 FISH 表所保存,FISH 表通過 ID 和 Animal 表中的數據進行關聯;而 Dog 對象的 SEX 屬性者被 Dog 表所保存,Dog 表通過 ID 和 Animal 表中的數據進行關聯。下面這個圖顯示了這種情況下對象繼承關系數據庫中的表現。


    圖 4. 第三種策略的數據庫表現
    圖 4. 第三種策略的數據庫表現

    這三種方式的處理對于開發者而言是透明的,無論選擇哪一種,僅僅影響數據在關系數據庫中的保存方式,對于開發者而言,只需要按照面向對象的方式操作對象既可,OpenJPA 框架在處理持久化操作的時候,會動態地判斷當前對象的實際類類型(后期綁定),從而確定持久化到哪個表中。在一個企業應用的實現中,開發者可以根據需要選擇這三種方式的一種或者幾種來處理對象之間的繼承關系。

    Inheritance 注釋

    OpenJPA 是一個基于注釋的持久化框架,對持久化的大多數元信息都只需要為實體類提供相應的注釋。開發者使用注釋描述實體和數據庫表之間的映射,也采用注釋描述對象繼承關系的持久化。javax.persistence.Inheritance 注釋用來指定對象繼承關系持久化的方式。它的 strategy 屬性用于指定持久化對象繼承關系在關系數據庫中的表現形式,可選擇項包括 SINGLE_TABLE、JOINED 和 TABLE_PER_CLASS。它們三個都是 javax.persistence.InheritanceType 中定義的常量。

    • SINGLE_TABLE

      strategy 設置為 SINGLE_TABLE 選項表示所有類及其子類保存在同一個數據庫表中,對象的類型使用表中的特殊字段 DTYPE 進行識別。

    • TABLE_PER_CLASS

      strategy 設置為該選項表示每個類使用一個表。

    • JOINED

      strategy 設置為該選項表示父類和子類分別保存在不同的數據庫表中,子類中不保存父類對應數據庫表中已有的屬性,僅通過主鍵進行關聯。

    javax.persistence.Inheritance 注釋是類級別的注釋。需要為每一個成為父類的實體類提供 javax.persistence.Inheritance 注釋并且指定 strategy 屬性。在同一個企業應用中,開發者可以根據實際情況選擇這三種策略中的一種,或者是幾種同時使用。

    posted on 2007-10-26 12:28 wilesun 閱讀(520) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 久久久国产精品亚洲一区| 中文字幕精品亚洲无线码二区| 91精品国产亚洲爽啪在线观看| 国产一级黄片儿免费看| 亚洲国产一区明星换脸| 羞羞视频免费网站日本| 中文字幕精品亚洲无线码二区| baoyu122.永久免费视频| 亚洲av永久无码精品漫画| 久久免费动漫品精老司机| 亚洲最大在线视频| 毛片网站免费在线观看| 久久久久久亚洲精品无码| 免费在线观看一级毛片| 中文字幕av无码不卡免费| 亚洲国产成人久久精品影视| 91香蕉国产线在线观看免费| 亚洲一区免费视频| 国产美女无遮挡免费视频网站| 免费无码国产在线观国内自拍中文字幕 | 久久综合国产乱子伦精品免费| 久久综合亚洲色一区二区三区| 在线看无码的免费网站| 亚洲日韩精品无码专区加勒比☆ | 精品一区二区三区免费视频| 国产av无码专区亚洲av桃花庵| 亚洲视频免费播放| 亚洲精华液一二三产区| 久久亚洲欧洲国产综合| 精品无码AV无码免费专区 | 亚洲一区二区三区国产精华液| 一本久久综合亚洲鲁鲁五月天| 97在线免费观看视频| 亚洲制服丝袜一区二区三区| 免费v片视频在线观看视频| 国产真人无码作爱免费视频| 亚洲人6666成人观看| 亚洲国产小视频精品久久久三级| 精品无码AV无码免费专区| 色屁屁www影院免费观看视频| 久久精品亚洲视频|