日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
談?wù)凥ibernate為何是Java開源項目

Java Hibernate還是比較常用的,于是我研究了一下對象模型與關(guān)系數(shù)據(jù)庫模型差異 ,在這里拿出來和大家分享一下,希望對大家有用

公司主營業(yè)務(wù):網(wǎng)站設(shè)計制作、網(wǎng)站制作、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出紅花崗免費做網(wǎng)站回饋大家。

一Hibernate意義

在一個真正的OOAD中,我們的設(shè)計首先是做UML建摸,最終將一個系統(tǒng)涉及所有對象(這個東西不是東西那么簡單)用類圖來體現(xiàn)一個完整的設(shè)計,我們***可能得到這幾種類:控制業(yè)務(wù)邏輯的類,保存業(yè)務(wù)數(shù)據(jù)的類module(bean類),輔助類或者更多(具體問題具體分析,但是將業(yè)務(wù)所需數(shù)據(jù)歸結(jié)為一個類module更適合分層)。到數(shù)據(jù)庫低層實現(xiàn)的時候,

為了獲取數(shù)據(jù)或者存儲數(shù)據(jù),你不得不為此加上一個操作數(shù)據(jù)庫的控制邏輯,到此,你***的設(shè)計估計會為此付出巨大的努力,因為你看到的業(yè)務(wù)數(shù)據(jù)層是一個復(fù)雜的模塊,即使從面向?qū)ο笥^點來看,我們UML類圖中的,業(yè)務(wù)數(shù)據(jù)層只是一個數(shù)據(jù)模塊。Java Hibernate已經(jīng)幫我們解決了業(yè)務(wù)數(shù)據(jù)層這個本來十分復(fù)雜的模塊的底層實現(xiàn),現(xiàn)在,我們只要在外層裹上我們的代表數(shù)據(jù)的類即可。

二對象模型與關(guān)系數(shù)據(jù)庫模型差異

在寫出我初探Java Hibernate的感受之前,我覺得寫下這一節(jié)還是很有必要的。帶著問題研究遠(yuǎn)遠(yuǎn)比帶著好奇研究要意義深遠(yuǎn)得多。

問題領(lǐng)域:

關(guān)系型數(shù)據(jù)庫是存儲數(shù)據(jù)的***選擇,但是隨著OO技術(shù)日益發(fā)展,在persisitent層上關(guān)系型數(shù)據(jù)庫的設(shè)計體系與OO體系格格不入,可以想象,當(dāng)滿腦子充斥著OOAD的你想到怎么隔離滿天飛的SQL語句時,那是多么痛苦的表情。無論你的業(yè)務(wù)層設(shè)計多么***,在真正儲存數(shù)據(jù)或者加載數(shù)據(jù)時,你面對的無非是一大堆封裝好的數(shù)據(jù),這些數(shù)據(jù)在JDBC中已經(jīng)完全失去對象(這里的對象稱之為業(yè)務(wù)對象或許更為確切)的意義,你整體的OOAD到此為止。為什么會造成這種情況呢?原因是對象模型與關(guān)系數(shù)據(jù)庫模型根本設(shè)計體系之間的差別。

對象模型與關(guān)系數(shù)據(jù)庫模型各自理論出發(fā)點是不同的:對象模型的理論體系可以簡單歸結(jié)為這兩點:

1) 以對象看待世界。

2) 對象間關(guān)系(繼承,關(guān)聯(lián),聚合,組合)維系著整體構(gòu)成。

而關(guān)系數(shù)據(jù)庫模型唯一出發(fā)點是有效儲存數(shù)據(jù),KEY是數(shù)據(jù)庫的關(guān)鍵技術(shù),關(guān)系在這里只是各個數(shù)據(jù)表的KEY之間的關(guān)聯(lián),這種關(guān)聯(lián)我覺得應(yīng)該稱之為數(shù)據(jù)的關(guān)聯(lián),其表達(dá)的意義遠(yuǎn)遠(yuǎn)沒有對象之間的關(guān)聯(lián)那么深廣。

那么,我現(xiàn)在最關(guān)心的問題是hibernate是怎么利用關(guān)系數(shù)據(jù)庫的數(shù)據(jù)表KEY關(guān)聯(lián)來表達(dá)對象之間的關(guān)系呢?

在進(jìn)入正式研究Hbernate之前,我們可以思索一下問題的似乎簡單與似乎十分復(fù)雜的矛盾。

我們設(shè)計的代表數(shù)據(jù)層的所有類必須***的體現(xiàn)在數(shù)據(jù)表之中??梢赃@樣總結(jié):

class-àtable

class1—(關(guān)系)---class2------〉table1---(關(guān)系)-----table2

問題的解決似乎很簡單,特別是對于javabean構(gòu)架,更是簡單(看起來簡單而已!?。。?。

想象一個簡單的javabean類:

 
 
 
  1. public class SimpleBean{   
  2.   protected int id;   
  3.   protected String name;   
  4.   public int getId(){   
  5.   return id;   
  6.   }   
  7.   public void setId(int id){   
  8.   this.id=id;   
  9.   }   
  10.   public String getName(){   
  11.   return name;   
  12.   }   
  13.   public void setName(String name){   
  14.   this,namename=name;   
  15.   }   
  16.   }   

我們完全可以這樣進(jìn)行name映射:

 
 
 
  1. className-àtableName   
  2.  
  3.   propertyNameàcolumnName  

一個類實例就是table的一行。這個問題很簡單的得到解決。再進(jìn)一步,考慮如下簡單的一對一類關(guān)聯(lián):

 
 
 
  1. public class Class1{   
  2.   public Class2 class2;   
  3.   public Class2 getclass2()…   
  4.   public void setClass2(Class2 class2)…   
  5.   }   
  6.   public class Class2{   
  7.   public Class1 class1;   
  8.   public Class1 getClass1()...   
  9.   ...   
  10.   }   

這種關(guān)系很顯然是雙向的,可以從class1中得到class2,反過來,也可以從class2中得到class1,那么體現(xiàn)到數(shù)據(jù)表中呢?首先可以肯定class1àtable1,class2àtable2;很顯然,table1和table2都要互相增加多一列來保存對方的key。

這些簡單的關(guān)系在數(shù)據(jù)庫表的關(guān)聯(lián)中得到了很好的支持,但是稍微復(fù)雜一點的呢?

諸如以下一個類:

 
 
 
  1. public class S {   
  2.   ArrayList datas;   
  3.   Public List getDatas()..   
  4.   Public void setDatas(List datas)..   
  5.   ….   
  6.   }   

這里如果簡單用上面所分析的propertyname-àColumnName顯然不可以,這種集合作為bean屬性我們該怎么在數(shù)據(jù)表中得到很好體現(xiàn)呢?如果這些集合只是簡單的String 集合,它在數(shù)據(jù)庫表里面是怎么表述的呢?如果這些集合是保存某些類實例的,似乎可以轉(zhuǎn)換為數(shù)據(jù)庫表的一對多的關(guān)系?

另外一方面,繼承體系是怎么在數(shù)據(jù)塊表里面得到體現(xiàn)的呢?繼承的關(guān)系怎么用數(shù)據(jù)庫的關(guān)聯(lián)關(guān)系表達(dá)呢?繼承所涉及的動態(tài)類識別怎么在數(shù)據(jù)庫中得到體現(xiàn)呢?

再往深處想一想,對于一個操作:

 
 
 
  1. public class BookStore{   
  2.   Set books;   
  3.   Public Set getBoos()..   
  4.   Public void setBooks(Set boos)…   
  5.   Public void addBook(Book book)…   
  6.   public class Book{   
  7.   public BookStore bookStore;   
  8.   public Parent getBookStore()..   
  9.   ..   
  10.   }   

在業(yè)務(wù)邏輯中,我們會這樣寫代碼:

 
 
 
  1. Book book=new Book();   
  2.   .bookStore.addBooks(book);   

上面兩行代碼便已經(jīng)清楚地建立了child與parent之間的關(guān)系,相對來說,數(shù)據(jù)庫中的數(shù)據(jù)也應(yīng)該根據(jù)這幾行代碼建立產(chǎn)生數(shù)據(jù)并建立這種關(guān)聯(lián)。此時內(nèi)存中的數(shù)據(jù)怎么跟數(shù)據(jù)庫中的數(shù)據(jù)一致呢?


分享名稱:談?wù)凥ibernate為何是Java開源項目
鏈接分享:http://www.dlmjj.cn/article/djojggp.html