Java開源項(xiàng)目Hibernate
在一個(gè)真正的OOAD中,我們的設(shè)計(jì)首先是做UML建摸,最終將一個(gè)系統(tǒng)涉及所有對(duì)象(這個(gè)東西不是東西那么簡(jiǎn)單)用類圖來體現(xiàn)一個(gè)完整的設(shè)計(jì),我們最后可能得到這幾種類:控制業(yè)務(wù)邏輯的類,保存業(yè)務(wù)數(shù)據(jù)的類module(bean類),輔助類或者更多(具體問題具體分析,但是將業(yè)務(wù)所需數(shù)據(jù)歸結(jié)為一個(gè)類module更適合分層)。到數(shù)據(jù)庫低層實(shí)現(xiàn)的時(shí)候,
為了獲取數(shù)據(jù)或者存儲(chǔ)數(shù)據(jù),你不得不為此加上一個(gè)操作數(shù)據(jù)庫的控制邏輯,到此,你完美的設(shè)計(jì)估計(jì)會(huì)為此付出巨大的努力,因?yàn)槟憧吹降臉I(yè)務(wù)數(shù)據(jù)層是一個(gè)復(fù)雜的模塊,即使從面向?qū)ο笥^點(diǎn)來看,我們UML類圖中的,業(yè)務(wù)數(shù)據(jù)層只是一個(gè)數(shù)據(jù)模塊。Hibernate已經(jīng)幫我們解決了業(yè)務(wù)數(shù)據(jù)層這個(gè)本來十分復(fù)雜的模塊的底層實(shí)現(xiàn),現(xiàn)在,我們只要在外層裹上我們的代表數(shù)據(jù)的類即可。
二)對(duì)象模型與關(guān)系數(shù)據(jù)庫模型差異
在寫出我初探Hibernate的感受之前,我覺得寫下這一節(jié)還是很有必要的。帶著問題研究遠(yuǎn)遠(yuǎn)比帶著好奇研究要意義深遠(yuǎn)得多。
問題領(lǐng)域:
關(guān)系型數(shù)據(jù)庫是存儲(chǔ)數(shù)據(jù)的最好選擇,但是隨著OO技術(shù)日益發(fā)展,在persisitent層上關(guān)系型數(shù)據(jù)庫的設(shè)計(jì)體系與OO體系格格不入,可以想象,當(dāng)滿腦子充斥著OOAD的你想到怎么隔離滿天飛的SQL語句時(shí),那是多么痛苦的表情。無論你的業(yè)務(wù)層設(shè)計(jì)多么完美,在真正儲(chǔ)存數(shù)據(jù)或者加載數(shù)據(jù)時(shí),你面對(duì)的無非是一大堆封裝好的數(shù)據(jù),這些數(shù)據(jù)在JDBC中已經(jīng)完全失去對(duì)象(這里的對(duì)象稱之為業(yè)務(wù)對(duì)象或許更為確切)的意義,你整體的OOAD到此為止。為什么會(huì)造成這種情況呢?原因是對(duì)象模型與關(guān)系數(shù)據(jù)庫模型根本設(shè)計(jì)體系之間的差別。
對(duì)象模型與關(guān)系數(shù)據(jù)庫模型各自理論出發(fā)點(diǎn)是不同的:對(duì)象模型的理論體系可以簡(jiǎn)單歸結(jié)為這兩點(diǎn):
1) 以對(duì)象看待世界。
2) 對(duì)象間關(guān)系(繼承,關(guān)聯(lián),聚合,組合)維系著整體構(gòu)成。
而關(guān)系數(shù)據(jù)庫模型唯一出發(fā)點(diǎn)是有效儲(chǔ)存數(shù)據(jù),KEY是數(shù)據(jù)庫的關(guān)鍵技術(shù),關(guān)系在這里只是各個(gè)數(shù)據(jù)表的KEY之間的關(guān)聯(lián),這種關(guān)聯(lián)我覺得應(yīng)該稱之為數(shù)據(jù)的關(guān)聯(lián),其表達(dá)的意義遠(yuǎn)遠(yuǎn)沒有對(duì)象之間的關(guān)聯(lián)那么深廣。
那么,我現(xiàn)在最關(guān)心的問題是hibernate是怎么利用關(guān)系數(shù)據(jù)庫的數(shù)據(jù)表KEY關(guān)聯(lián)來表達(dá)對(duì)象之間的關(guān)系呢?
在進(jìn)入正式研究Hbernate之前,我們可以思索一下問題的似乎簡(jiǎn)單與似乎十分復(fù)雜的矛盾。
我們?cè)O(shè)計(jì)的代表數(shù)據(jù)層的所有類必須完美的體現(xiàn)在數(shù)據(jù)表之中??梢赃@樣總結(jié):
class-àtable
class1—(關(guān)系)---class2------〉table1---(關(guān)系)-----table2
問題的解決似乎很簡(jiǎn)單,特別是對(duì)于javabean構(gòu)架,更是簡(jiǎn)單(看起來簡(jiǎn)單而已!?。。?
想象一個(gè)簡(jiǎn)單的javabean類:
public class SimpleBean{
protected int id;
protected String name;
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getName(){
return name;
}
public void setName(String name){
this,name=name;
}
}
我們完全可以這樣進(jìn)行name映射:
className-àtableName
propertyNameàcolumnName
一個(gè)類實(shí)例就是table的一行。這個(gè)問題很簡(jiǎn)單的得到解決。
再進(jìn)一步,考慮如下簡(jiǎn)單的一對(duì)一類關(guān)聯(lián):
public class Class1{
public Class2 class2;
public Class2 getclass2()…
public void setClass2(Class2 class2)…
}
public class Class2{
public Class1 class1;
public Class1 getClass1()...
...
}
這種關(guān)系很顯然是雙向的,可以從class1中得到class2,反過來,也可以從class2中得到class1,那么體現(xiàn)到數(shù)據(jù)表中呢?首先可以肯定class1àtable1,class2àtable2;很顯然,table1和table2都要互相增加多一列來保存對(duì)方的key。
這些簡(jiǎn)單的關(guān)系在數(shù)據(jù)庫表的關(guān)聯(lián)中得到了很好的支持,但是稍微復(fù)雜一點(diǎn)的呢?
諸如以下一個(gè)類:
public class S {
ArrayList datas;
Public List getDatas()..
Public void setDatas(List datas)..
….
}
這里如果簡(jiǎn)單用上面所分析的propertyname-àColumnName顯然不可以,這種集合作為bean屬性我們?cè)撛趺丛跀?shù)據(jù)表中得到很好體現(xiàn)呢?如果這些集合只是簡(jiǎn)單的String 集合,它在數(shù)據(jù)庫表里面是怎么表述的呢?如果這些集合是保存某些類實(shí)例的,似乎可以轉(zhuǎn)換為數(shù)據(jù)庫表的一對(duì)多的關(guān)系?
另外一方面,繼承體系是怎么在數(shù)據(jù)塊表里面得到體現(xiàn)的呢?繼承的關(guān)系怎么用數(shù)據(jù)庫的關(guān)聯(lián)關(guān)系表達(dá)呢?繼承所涉及的動(dòng)態(tài)類識(shí)別怎么在數(shù)據(jù)庫中得到體現(xiàn)呢?
再往深處想一想,對(duì)于一個(gè)操作:
public class BookStore{
Set books;
Public Set getBoos()..
Public void setBooks(Set boos)…
Public void addBook(Book book)…
public class Book{
public BookStore bookStore;
public Parent getBookStore()..
..
}
在業(yè)務(wù)邏輯中,我們會(huì)這樣寫代碼:
Book book=new Book();
.bookStore.addBooks(book);
上面兩行代碼便已經(jīng)清楚地建立了child與parent之間的關(guān)系,相對(duì)來說,數(shù)據(jù)庫中的數(shù)據(jù)也應(yīng)該根據(jù)這幾行代碼建立產(chǎn)生數(shù)據(jù)并建立這種關(guān)聯(lián)。此時(shí)內(nèi)存中的數(shù)據(jù)怎么跟數(shù)據(jù)庫中的數(shù)據(jù)一致呢?
相關(guān)文章
jsp+Servlet編程實(shí)現(xiàn)驗(yàn)證碼的方法
這篇文章主要介紹了jsp+Servlet編程實(shí)現(xiàn)驗(yàn)證碼的方法,結(jié)合實(shí)例分析了jsp+servlet實(shí)現(xiàn)驗(yàn)證碼所需的相關(guān)類與具體功能實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11JSP教程之使用JavaBean完成業(yè)務(wù)邏輯的方法
這篇文章主要介紹了JSP教程之使用JavaBean完成業(yè)務(wù)邏輯的方法,較為詳細(xì)的分析了JavaBean完成業(yè)務(wù)邏輯所涉及的相關(guān)概念及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09jsp session.setAttribute()和session.getAttribute()用法案例詳解
這篇文章主要介紹了jsp session.setAttribute()和session.getAttribute()用法案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08js實(shí)現(xiàn)隨機(jī)的四則運(yùn)算題目效果
本文主要介紹了js實(shí)現(xiàn)隨機(jī)的四則運(yùn)算題目效果,可以隨機(jī)的進(jìn)行加減乘除的運(yùn)算,有興趣的同學(xué)可以了解一下。2016-10-10JSP中response.setContentType和response.setCharacterEncoding區(qū)別分
這篇文章主要介紹了JSP中response.setContentType和response.setCharacterEncoding區(qū)別分析,較為詳細(xì)的分析了response.setContentType和response.setCharacterEncoding的功能與具體使用技巧,需要的朋友可以參考下2015-10-10JSP servlet實(shí)現(xiàn)文件上傳下載和刪除
這篇文章主要為大家詳細(xì)介紹了JSP servlet實(shí)現(xiàn)文件上傳下載和刪除,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12Jsp連接Access數(shù)據(jù)庫(不通過建立ODBC數(shù)據(jù)源的方法)
Jsp連接Access數(shù)據(jù)庫(不通過建立ODBC數(shù)據(jù)源的方法)...2007-02-02JSP自定義標(biāo)簽-標(biāo)簽屬性_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
對(duì)自定義標(biāo)簽添加一些屬性,可以使我們的標(biāo)簽功能更加靈活和復(fù)用。下面通過本文給大家分享JSP自定義標(biāo)簽-標(biāo)簽屬性的相關(guān)知識(shí),感興趣的朋友一起看看吧2017-07-07