国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

開源框架Hibernate 3 的Formulas(圖)

2019-11-18 12:57:25
字體:
供稿:網(wǎng)友

  Hibernate 和SPRing是越來越來的J2EE應(yīng)用程序使用的兩個突出的開源框架。雖然他們面向的是不同問題,但是他們都有共同的要害特征:依靠注射。在返回對象給客戶之前,Spring建立對象之間的依靠關(guān)系,這樣減少了在使用這些對象的客戶中的大量代碼。Hibernate專門在返回一個完整的對象模型給客戶之前挑選出數(shù)據(jù)模型和對象模型之間的依靠關(guān)系。當(dāng)直接使用JDBC來映射數(shù)據(jù)模型到對象模型的時候,我們通常需要寫大量的代碼來建立對象模型。Hibernate減少了這部分這樣的編碼工作。
  
  Hibernate2.x 提供了基本的表到表的映射,正常的關(guān)聯(lián)映射(包括一對一,一對多,多對多關(guān)系),多態(tài)映射,等等。Hibernate3.x通過formula, filter, subselect來增強映射的靈活性,把這些映射提個到另一高度。
  
  在本文中,我們將要向你展現(xiàn)formula的各種特征是如何輔助模式轉(zhuǎn)換的。在Hibernate3.x之前,formula的屬性僅僅出現(xiàn)在一個property元素中。Hibernate3.x在保持原來用法的同時,還提供了一個formula的屬性或元素(兩者在formula的使用方面都是等價的),能夠用于任何元素中,包括discriminator, many-to-one, one-to-one, element, many-to-many, map-key, map-key-many-to-many, 和 property。這將給對象關(guān)系映射(O-R)增加非常大的靈活性,并且可以對復(fù)雜的數(shù)據(jù)模型進行更加精致的解釋。
  
  兩種必須使用formula的主要情景是:
  
  1.需要使用formula計算結(jié)果的情形。帶有元素discriminator, element, map-key, map-key-many-to-many, 和 property的formula歸為這一類。
  
  2.需要使用formula來進行連接操作的情形。在元素many-to-one, one-to-one, 和 many-to-many中使用的formula歸為這一類。
  
  第一類:通過公式計算結(jié)果
  
  識別器
  
  在實際的數(shù)據(jù)模式中,經(jīng)常存在使用一個表來描述另一個表的情況。formula能夠有助于在O-R映射中提供靈活的多態(tài)。
  
  在圖1例子中,有兩個表ProdUCt和ProductRelease。每一個Product的記錄都在ProductRelease有一個ProductReleaseID的引用,包括產(chǎn)品發(fā)布名稱,類型,發(fā)行日期等。
  
 開源框架Hibernate 3 的Formulas(圖)(圖一)

  
圖1.產(chǎn)品和產(chǎn)品發(fā)布數(shù)據(jù)模型

  
  在表ProductRelease中有一個讓人感愛好的屬性是SubProductAllowable,它的值要么是0,要么是1。值1就意味著這個產(chǎn)品發(fā)布下的任意產(chǎn)品答應(yīng)有子產(chǎn)品,而值0則意味著不答應(yīng)這樣的子產(chǎn)品。例如,一些產(chǎn)品是從多個子產(chǎn)品裝配而來的,而另一些產(chǎn)品,他們單獨地成為獨立的單元。
  
  圖2展現(xiàn)了一個解釋這種數(shù)據(jù)模式的對象模型。Nested的接口定義了getSubProducts和setSubProducts方法。類NestedProduct擴展了基類Product,也實現(xiàn)了接口Nested。產(chǎn)品數(shù)據(jù)記錄是一個Product還是一個NestedProduct,依靠于產(chǎn)品相應(yīng)的產(chǎn)品發(fā)布記錄的域SubProductAllowable的值。
  
 開源框架Hibernate 3 的Formulas(圖)(圖二)

  
圖2.產(chǎn)品和產(chǎn)品發(fā)布對象領(lǐng)域模型
  

  為了實現(xiàn)這個模型轉(zhuǎn)換,使用下面的Hibernate3.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表達式計算的結(jié)果是0,也就是說,該產(chǎn)品不存在子產(chǎn)品,那么,該對象就是類Product的實例。假如結(jié)果是1,那么對象就是類NestedProduct的實例。 在表1和2中,對于表Product中的第一個記錄(ProductID=10000001),因為它引用了一個有著SubProductAllowable=1的ProductRelease產(chǎn)品記錄,所以,初始化的類將是NestedProduct。而在產(chǎn)品Product表中的第二個記錄(ProductID=20000001),因為它引用了有著SubProductAllowable=0的表ProductRelease的記錄,所以,初始化類將會是Product。
  
 開源框架Hibernate 3 的Formulas(圖)(圖三)

  
表1.表ProductRelease中的記錄

  
 開源框架Hibernate 3 的Formulas(圖)(圖四)

  
表2表Product中的記錄

  
  Property
  
  Property元素中的formula答應(yīng)對象屬性包含某些衍生值,像sum, average, max,等計算的結(jié)果,
  
  例如:
  <property name="averagePrice" formula="(select avg(pc.price) from PriceCatalogue pc, SelectedItems si where si.priceRefID=pc.priceID)"/>
  
  而且,formula也有助于從另一表中通過當(dāng)前記錄的某個屬性值來獲取數(shù)據(jù)。例如:
  <property name="currencyName" formula="(select cur.name from currency cur where cur.id= currencyID)"/>
  
  這有助于從表currency中檢索currency名稱。正如你看到的那樣,這些直接映射能夠省下許多轉(zhuǎn)換的代碼。
  
  map-key
  
  formula答應(yīng)map-key擁有任何可能的值。在下面的例子(圖3)中,我們將Role_roleID作為對象模型(圖4)的map-key。
  
 開源框架Hibernate 3 的Formulas(圖)(圖五)

  
圖3.User Role數(shù)據(jù)模式

  
 開源框架Hibernate 3 的Formulas(圖)(圖六)

  
圖4.User Role對象模型

  
  在上面的數(shù)據(jù)模型中,User和Role通過一個叫做User_has_Role的關(guān)系表連接成多對多(many-to-many)關(guān)系。為了獲得一個User及其所有與之關(guān)聯(lián)的Roles,我們可以使用下面的映射:
  
  <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并不答應(yīng)Role_RoleID同時出現(xiàn)在map-key和many-to-many中。但是,使用formula,Role_RoleIDf卻也能夠用于map-key中。
  
  另一種情景:element, map-key-many-to-many, 及其它與property一樣,element能夠被賦給任何有效formula表達式的運算值。
  
  帶有map-key-many-to-many的formula的使用,類似于帶有map-key的formula。然而,map-key-many-to-many經(jīng)常使用在三重關(guān)系中。在三重關(guān)系中,一個映射的鍵本身是被參照的對象,而不是一個被參照的屬性。
  
  然而,有幾種formula不支持的情形。一些數(shù)據(jù)庫(例如Oracle 7)不支持嵌入SQL語句(這就是說,在SQL語句的select部分嵌入SQL語句),在這種情況下,不支持使用formula來計算結(jié)果。因此,你需要首先檢查是否支持嵌入SQL語句。
  
  由于來自于Hibernate映射的SQL使用formula表達式作為它的select目標(biāo)結(jié)果的表達式部分,所以,知道一些你所使用的數(shù)據(jù)庫SQL語句的知識,將有助于你使用formula,盡管這會減少代碼的移植性。
  
  第二種情形:使用formula來連接
  
  多對一
  
  另一個在實際中常見的數(shù)據(jù)模型是屬性關(guān)系映射(proprietary relationship mapping),也就是除了基本的一對一,一對多,多對多關(guān)系而外的映射關(guān)系。formula是一個用于這種屬性關(guān)系治理的元素之一。圖5展現(xiàn)了一個例子,在這個例子中,一個公司可能有許多聯(lián)系人,但是他們中僅僅只有一個是缺省的聯(lián)系人。有許多聯(lián)系人的公司是典型的一對多關(guān)系。然而,為了標(biāo)識缺省聯(lián)系人,表ContactPerson使用屬性defaultFlag來標(biāo)識他們(1表示是,0表示不是)。
  
 開源框架Hibernate 3 的Formulas(圖)(圖七)

  
圖5.用戶角色數(shù)據(jù)模式

  
開源框架Hibernate 3 的Formulas(圖)(圖八)

  
圖6. 用戶角色對象模型

  
  為了解釋在對象模型中(圖6)缺省聯(lián)系人關(guān)系,我們使用下面的映射:
  
  <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元素中,它構(gòu)成了表Person的唯一鍵值。在Company類中的many-to-one元素與類Person中的defaultContactPerson properties元素相連接。最后的SQL語句如下:

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 土默特右旗| 醴陵市| 宣化县| 隆德县| 交城县| 伊吾县| 淮阳县| 勃利县| 印江| 阿勒泰市| 集贤县| 泽库县| 宁都县| 惠来县| 石棉县| 哈巴河县| 云安县| 永泰县| 乳山市| 洮南市| 扎鲁特旗| 河东区| 甘肃省| 邹城市| 宁都县| 阳山县| 搜索| 方城县| 青铜峡市| 邯郸县| 湟源县| 台中市| 山阳县| 晋中市| 台中县| 敦煌市| 西畴县| 福安市| 贵德县| 阿坝| 高雄市|