自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

談?wù)凥ibernate為何是Java開(kāi)源項(xiàng)目

開(kāi)發(fā) 后端
Java Hibernate有很多值得學(xué)習(xí)的地方,這里我們主要介紹Hibernate意義和對(duì)象模型與關(guān)系數(shù)據(jù)庫(kù)模型差異。

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

一Hibernate意義

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

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

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

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

問(wèn)題領(lǐng)域:

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

對(duì)象模型與關(guān)系數(shù)據(jù)庫(kù)模型各自理論出發(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ù)庫(kù)模型唯一出發(fā)點(diǎn)是有效儲(chǔ)存數(shù)據(jù),KEY是數(shù)據(jù)庫(kù)的關(guān)鍵技術(shù),關(guān)系在這里只是各個(gè)數(shù)據(jù)表的KEY之間的關(guān)聯(lián),這種關(guān)聯(lián)我覺(jué)得應(yīng)該稱(chēng)之為數(shù)據(jù)的關(guān)聯(lián),其表達(dá)的意義遠(yuǎn)遠(yuǎn)沒(méi)有對(duì)象之間的關(guān)聯(lián)那么深廣。

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

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

我們?cè)O(shè)計(jì)的代表數(shù)據(jù)層的所有類(lèi)必須***的體現(xiàn)在數(shù)據(jù)表之中。可以這樣總結(jié):

class-àtable

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

問(wèn)題的解決似乎很簡(jiǎn)單,特別是對(duì)于javabean構(gòu)架,更是簡(jiǎn)單(看起來(lái)簡(jiǎn)單而已?。。。?。

想象一個(gè)簡(jiǎn)單的javabean類(lèi):

  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  

一個(gè)類(lèi)實(shí)例就是table的一行。這個(gè)問(wèn)題很簡(jiǎn)單的得到解決。再進(jìn)一步,考慮如下簡(jiǎn)單的一對(duì)一類(lèi)關(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,反過(guò)來(lái),也可以從class2中得到class1,那么體現(xiàn)到數(shù)據(jù)表中呢?首先可以肯定class1àtable1,class2àtable2;很顯然,table1和table2都要互相增加多一列來(lái)保存對(duì)方的key。

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

諸如以下一個(gè)類(lèi):

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

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

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

再往深處想一想,對(duì)于一個(gè)操作:

  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ù)邏輯中,我們會(huì)這樣寫(xiě)代碼:

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

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

【編輯推薦】

  1. Hibernate入門(mén)學(xué)習(xí)寶典
  2. Hibernate屬性簡(jiǎn)單分析
  3. Struts-Spring-Hibernate案例
  4. Hibernate Sessin接口常用方法
  5. Hibernate事務(wù)全面介紹
責(zé)任編輯:仲衡 來(lái)源: it168
相關(guān)推薦

2015-07-30 09:22:49

開(kāi)源項(xiàng)目

2021-03-23 14:51:03

半導(dǎo)體芯片手機(jī)廠商

2022-06-19 14:10:48

開(kāi)源軟件企業(yè)Linux 基金會(huì)

2012-07-26 13:18:15

開(kāi)源系統(tǒng)

2011-11-28 10:26:45

SIPOC原創(chuàng)輸出

2009-06-26 16:12:59

2015-07-30 09:46:42

開(kāi)源項(xiàng)目

2021-01-14 11:05:41

項(xiàng)目配置屬性

2011-07-14 14:15:31

2009-09-22 10:46:00

Hibernate項(xiàng)目

2012-03-12 17:20:38

微軟Mayhem開(kāi)源

2009-06-24 14:10:27

Java開(kāi)源GIS項(xiàng)目

2013-06-04 09:07:49

OpenStack開(kāi)源技術(shù)開(kāi)源云計(jì)算

2018-01-24 06:47:37

物聯(lián)網(wǎng)開(kāi)源操作系統(tǒng)

2015-07-20 09:35:57

開(kāi)源商業(yè)模式

2013-03-19 09:33:46

項(xiàng)目

2011-06-21 14:46:44

Hibernate

2019-09-10 09:58:19

Dubbo負(fù)載均衡Hash

2013-08-13 09:45:16

開(kāi)源項(xiàng)目

2015-07-09 10:55:59

開(kāi)放容器項(xiàng)目DockerCon云計(jì)算
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)