麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

開(kāi)源框架Hibernate 3 的Formulas(圖)

2019-11-18 12:57:25
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

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

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

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

  為了實(shí)現(xiàn)這個(gè)模型轉(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表達(dá)式計(jì)算的結(jié)果是0,也就是說(shuō),該產(chǎn)品不存在子產(chǎn)品,那么,該對(duì)象就是類(lèi)Product的實(shí)例。假如結(jié)果是1,那么對(duì)象就是類(lèi)NestedProduct的實(shí)例。 在表1和2中,對(duì)于表Product中的第一個(gè)記錄(ProductID=10000001),因?yàn)樗昧艘粋€(gè)有著SubProductAllowable=1的ProductRelease產(chǎn)品記錄,所以,初始化的類(lèi)將是NestedProduct。而在產(chǎn)品Product表中的第二個(gè)記錄(ProductID=20000001),因?yàn)樗昧擞兄鳶ubProductAllowable=0的表ProductRelease的記錄,所以,初始化類(lèi)將會(huì)是Product。
  
 開(kāi)源框架Hibernate 3 的Formulas(圖)(圖三)

  
表1.表ProductRelease中的記錄

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

  
表2表Product中的記錄

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

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

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

  
圖4.User Role對(duì)象模型

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

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

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

  
圖6. 用戶(hù)角色對(duì)象模型

  
  為了解釋在對(duì)象模型中(圖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類(lèi)中的many-to-one元素與類(lèi)Person中的defaultContactPerson properties元素相連接。最后的SQL語(yǔ)句如下:

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 美女喷水网站 | 欧美一级美片在线观看免费 | 久久国产精 | 香蕉久草视频 | 国产精品久久久久久久av | 鲁丝片一区二区三区免费入口 | 日本精品婷婷久久爽一下 | 欧美精品久久久久久久多人混战 | 他也色在线视频 | av黄色片网站| 精品中文字幕在线播放 | 成人毛片免费 | 国产中出视频 | 久久精品视频亚洲 | 本站只有精品 | 蜜桃成品人免费视频 | 天天夜夜操操 | 久久久久久69 | 欧美18—19sex性hd按摩 | 亚洲成人福利网站 | 亚洲日韩精品欧美一区二区 | 一级黄色在线免费观看 | 72pao成人国产永久免费视频 | 免费h片| 91 视频网站 | 日本中文高清 | 一本大道av| 久久国产乱子伦精品 | 91精品久久久久久久久网影视 | 羞羞的小视频 | 亚洲成人精品区 | 蜜桃网在线观看 | 色婷婷一区二区三区 | www.guochanav.com | 羞羞视频2023 | 欧美成人三级大全 | 久久精品免费国产 | h视频在线免费观看 | 视频在线色 | 一级免费黄色 | www.9191.com|