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

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

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

    鷹翔宇空

    學習和生活

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks

    原文引自:http://www.tkk7.com/rosen/archive/2005/09/19/13317.html

    ?

    ??? HibernateSpring 這兩個突出的開源框架被越來越多的應用到 J2EE 中。盡管目標有著不同的問題空間,它們卻共享一個關鍵特性:依賴注入。在對象返回到客戶端之前 Spring 協助挑選出這些對象間依賴關系,減少客戶端代碼量。而 Hibernate 專門挑選出在完整的對象模型返回客戶端之前由數據模型表現的依賴關系。當使用 JDBC 直接從數據模型映射到對象模型時,我們通常需要書寫大量的代碼來構建對象模型。Hibernate 的出現淘汰了這種繁瑣的編碼工作。
    ???
    ??? Hibernate 2.x 提供基本的表到對象的映射,標準關聯映射(包括 one-to-one, one-to-many 以及 many-to-many 關系),多態映射,等等。Hibernate 3.x 沿著路線繼續前進,formula、filter、subselect 等,使映射更加靈活,提供用細粒度的解釋特性。
    ???
    ??? 在本文中,將闡述 formula 到底有哪些特性可幫助我們進行模型轉換。Hibernate 3.x 之前,formula 屬性只能出現在 property 元素中。但是到了現在,你可以在許多元素中使用 Hibernate 3.x 提供的 formula 屬性或元素(formula 用法方面都是一樣的),包括 discriminator、element、many-to-many、map-key、map-key-many-to-many、以及 property。它增加了 OR 映射的靈活性,因此允許對復雜數據模型更加細粒的解釋。
    ???
    ??? 下面有兩個 formula 應用場景:
    ???
    ??? 1. formula 用于評估結果的場合。在 discriminator、element、map-key、map-key-many-to-many以及 property 元素中注入 formula。
    ??? 2. formula 用于連接目的的場合。在 many-to-one、one-to-one 以及 many-to-many 元素中注入 formula。
    ???
    范疇 1:從 formula 獲得評估結果
    ???
    ??? Discriminator
    ???
    ??? 在真實的數據 schema 中,經常出現一個表被用于描述其他表的情況。formula 可協助提供靈活的多態 OR 映射。
    ???
    ??? 在圖 1 的范例中,有兩個表:Product 和 ProductRelease。每條 product 記錄都有一個 ProductReleaseID 參考相應的產品出廠記錄,包括 product release name、type、release date 等等。

    ????????? Product and Product Release Data Model
    ? ???????????????????? 圖 1. Product 和 product release
    ???
    ??? ProductRelease 表中有個有趣的屬性 SubProductAllowable,該屬性的值為 1 或 0。值為 1 代表允許任何的次品出廠,但是 0 不允許次品出廠。
    ???
    ??? 圖 2 展示了由數據模型解釋的對象模型。Nested 接口定義了 getSubProducts 和 setSubProducts 方法。NestedProduct 類繼承 Product 基類并實現 Nested 接口。無論產品數據記錄是 Product 或 NestedProduct,都取決于產品出廠記錄中 SubProductAllowable 的值。

    ??????? Product and Product Release Object Domain Model
    ???????????????????? 圖 2. Product 和產品出廠對象域模型
    ???
    ??? 為了完成模型轉換,我們使用如下的 Hibernate 3.x 映射:
    ????

    < hibernate-mapping >
    ??
    < class? name ="Product" ?
    ????????discriminator-value
    ="0" ??lazy ="false" >
    ????
    < id? name ="id" ?type ="long" /> ???????
    ????
    < discriminator?
    ????????
    formula ="(select?pr.SubProductAllowable?
    ????????????????from?ProductRelease?pr?
    ????????????????where?pr.productReleaseID=
    ????????????????????????productReleaseID)"

    ????????type
    ="integer" ? />
    ????
    < subclass?? name ="NestedProduct" ??
    ????????discriminator-value
    ="1" />
    ??
    </ class >
    </ hibernate-mapping >

    ??? 如果 formula 表達式評估結果為 0 時--也就是不允許次品出廠--那么對象將是 Product 類。如果結果是 1,那么對象將是 NestedProduct。在表 1 和 2 中,表 Product 的第一條記錄(ProductID=10000001),已初始化的類將是 NestedProduct,因為它參考一條 SubProductAllowable=1 的 ProductRelease 記錄。表 Product 的第二條記錄(ProductID=20000001),已初始化的類將是 Product,因為它參考一條 SubProductAllowable=0 的 ProductRelease 記錄。
    ???

    S/N ProductReleaseID SubProductAllowable ...
    1 11 1 ?-
    2 601 0 ?-
    ??????? 表 1. ProductRelease 表中的記錄
    ???
    S/NProductIDProductReleaseID...
    11000000111?-
    220000001601...
    ??????? 表 2. Product 表中的記錄
    ???
    ??? Property
    ???
    ??? 在 property 元素中的 formula 允許對象屬性包含特定引伸值,比如對結果進行 sum、average、max 等等。
    <property?name="averagePrice"?formula="(select?avg(pc.price)?from?PriceCatalogue?pc,?SelectedItems?si?where?si.priceRefID=pc.priceID)"/>

    ??? 此外,formula 也能協助從基于當前記錄的特定值向其它表檢索數據。例如:

    <property?name="currencyName"?formula="(select?cur.name?from?currency?cur?where?cur.id=?currencyID)"/>

    ??? 這將由助于從 currency 表檢索 currency name。正如你所看到的,這樣直接映射可消除許多轉換編碼。
    ???
    ??? map-key
    ???
    ??? formula 允許 map-key 持有任何可能的值。下列范例(圖 3),我們想讓 Role_roleID 成為對象模型的 map-key(圖 4)。

    ???????????????? User Role Data Schema???
    ????????????????????????? 圖 3. 用戶角色數據 schema

    ?? User Role Object Model
    ????????????????????????????圖 4. 用戶角色對象模型
    ???
    ??? 在前面的數據 schema 中,User 和 Role 由 User_has_Role 通過 many-to-many 關系關聯調用。為了獲取某個 User 所有的指派角色,我們進行如下映射:

    <hibernate-mapping>
    ??
    <class?name="User">
    ????
    <id?name="userID"/>
    ????
    <map?name="roles"??
    ????????table
    ="UserRole"/>
    ??????
    <key?column="User_userID"/>
    ??????
    <map-key?
    ????????
    formula="Role_RoleID"?
    ????????type
    ="string"/>
    ??????
    <many-to-many?
    ????????
    column="Role_RoleID"
    ????????class
    ="Role"/>
    ????
    </map>
    ??
    </class>
    ??
    <class?name="Role">
    ????
    <id?name="roleID"/>
    ??
    </class>
    </hibernate-mapping>

    ??? Role_RoleID 通常用于連接 many-to-many 元素的欄位值。Hibernate 通常不允許 Role_RoleID 出現在 map-key 和 many-to-many 的欄位屬性中。但是有了 formula,Role_RoleID 也能用于 map-key。
    ???
    ??? element、map-key-many-to-many 以及其他
    ???
    ??? element 和 property 類似,能從任何有效的 formula 表達式賦予評估值。
    ???
    ??? map-key-many-to-many 中 formula 的用法類似于 map-key。但是,map-key-many-to-many 通常用于三重關系,map key 是一個被自己參考的對象,而不是被參考的屬性。
    ???
    ??? 那么,到底哪些情況下 formula 不支持呢?有些數據庫(例如 Oracle 7)就不支持嵌入式 select 語句(也就是說一條 select SQL 內嵌在另外一條 select SQL 語句中),這種情況 formula 就不支持評估結果。因此,你應該首先檢查嵌入式 select SQL 語句是否被支持。
    ???
    ??? 一旦 Hibernate 的映射拿 formula 表達式作為 select SQL 選取的一部分,請確認數據庫 SQL 方言是否允許使用 formula,盡管這樣將降低代碼輕便性。
    ???
    范疇 2:formula 用于連接

    ??? many-to-one
    ???
    ??? 另一個普遍的場景是真實世界的數據模型是所有者關系映射,這意味著映射是不同于 one-to-one、one-to-many 以及 many-to-many 關系的,formula 是提供所有者關系管理元素中的一個。圖 5 展示了某公司可有多個聯系人,但是其中只有一個為默認聯系人的范例。一個公司有多個聯系人是典型的 one-to-many 關系。但是,為了標識默認聯系人,ContactPerson 表使用了 defaultFlag 參數(1 是 yes, 0是 no)。

    ???????????????
    ????????????????????????圖 5. 用戶角色數據 schema

    ?????????????
    ?????????????????????????? 圖 6. 用戶角色對象模型
    ???
    ??? 為了說明對象模型(圖 6)中默認聯系人關系,我們使用如下映射文件:

    <hibernate-mapping>
    ??
    <class?name="Company"?table="Company">
    ????
    <id?name="id"?/>
    ????
    <many-to-one?
    ??????
    name="defaultContactPerson"?
    ??????property-ref
    ="defaultContactPerson">
    ????????
    <column?name="id"/>
    ????????
    <formula>1</formula>
    ????????
    </many-to-one>
    ??
    </class>
    ??
    <class?name="Person"?>
    ????
    <id?name="id"?/>
    ????
    <properties?name="defaultContactPerson">
    ????????
    <property?name="companyID"?/>
    ????????
    <property?name="defaultFlag"?/>
    ????
    </properties>
    ??
    </class>
    </hibernate-mapping>

    ??? 如上,我們把 companyID 和 defaultFlag 組織到名為 defaultContactPerson 的 properties 元素中,做為 Person 表的 unique key。Company 類中的 many-to-one 元素連接 Person 表的 defaultContactPerson properties 元素。輸出的 SQL 像這樣:
    ???
    ??? select c.id, p.id from Company c, Person p where p.companyID=c.id and p.defaultFlag=1
    ???
    ??? one-to-one
    ???
    ??? Hibernate 中,one-to-one 主要用于兩張表共享同一主鍵的情況。對于外鍵關聯,我們通常使用 many-to-one 來代替。但是,有了 formula,one-to-one 可以通過外鍵連接表。上面的 many-to-one 范例可以通過 one-to-one 來映射:

    <hibernate-mapping>
    ??
    <class?name="Company"?table="Company"?>
    ????
    <id?name="id"?/>
    ????
    <one-to-one?name="defaultContactPerson"?
    ????????property-ref
    ="defaultContactPerson"?>
    ????
    <formula>id</formula>
    ????
    <formula>1</formula>
    ????
    </one-to-one>
    ??
    </class>
    ??
    <class?name="Person"?>
    ????
    <id?name="id"?/>
    ????
    <properties?name="defaultContactPerson">
    ??????
    <property?name="companyID"?/>
    ??????
    <property?name="defaultFlag"?/>
    ????
    </properties>
    ???
    </class>
    </hibernate-mapping>

    ??? many-to-many
    ???
    ??? formula 用于當 many-to-many 元素為關系表和實體表連接的特殊關系,盡管通常沒有必要這樣用。
    ???
    總結

    ??? 文章范例展示了大部分 formula 的適用情景。當需要 formula 評估值時,formula 表達式將出現在 產生的 SQL 語句的 select 部分。當 formula 用于連接時,它出現在產生的 SQL 語句的 where 部分。此外,formula 表達式可用于任何 SQL 方言,只要目標數據庫支持。最后,formula 可協助完成從數據模型到對象模型的無代碼細粒度映射。

    posted on 2006-02-14 13:38 TrampEagle 閱讀(361) 評論(0)  編輯  收藏 所屬分類: hibernate
    主站蜘蛛池模板: 亚洲av午夜精品无码专区| 久久久久国产亚洲AV麻豆| 亚洲大片在线观看| 免费无码又爽又刺激一高潮| 亚洲最大AV网站在线观看| 一级成人a免费视频| 亚洲乱码国产一区网址| 国产精品福利在线观看免费不卡| 亚洲免费一区二区| 中文字幕无码免费久久9一区9| 国产国拍精品亚洲AV片| 伊人久久免费视频| 亚洲一区二区三区精品视频| 在线免费一区二区| 国产亚洲Av综合人人澡精品| 中文字幕日韩亚洲| 日本三级在线观看免费| 4480yy私人影院亚洲| 国产精品视频永久免费播放| 精品女同一区二区三区免费播放 | 九月丁香婷婷亚洲综合色| 国产色无码精品视频免费| 久久精品国产精品亚洲毛片| 国产免费久久精品99re丫y| 亚洲国产一区二区三区在线观看| 亚洲不卡AV影片在线播放| a级成人毛片免费视频高清| 亚洲精品视频在线观看免费| 毛片免费观看网站| 人碰人碰人成人免费视频| 噜噜噜亚洲色成人网站∨| 成人免费看黄20分钟| 本免费AV无码专区一区| 亚洲欧洲精品国产区| 国产免费看插插插视频| 日本免费中文字幕| 国产精品亚洲а∨无码播放不卡| 亚洲AV无码成人精品区在线观看| 无码人妻一区二区三区免费手机| 日韩电影免费在线观看网址 | 亚洲综合精品香蕉久久网|