Hibernate中的主鍵釋疑
hibernate的配置文件其實(shí),java語(yǔ)言按內(nèi)存地址來(lái)識(shí)別或區(qū)分一個(gè)類的不同對(duì)象,而關(guān)系數(shù)據(jù)庫(kù)按主鍵值來(lái)區(qū)分同一個(gè)表的不同記錄,hibernate使用對(duì)象標(biāo)識(shí)符(OID)來(lái)建立內(nèi)存中的對(duì)象和數(shù)據(jù)庫(kù)表中記錄的對(duì)應(yīng)關(guān)系,為保證OID的唯一性,應(yīng)讓hibernate而不是應(yīng)用程序?yàn)槠滟x值。
作為主鍵的字段必須不為空,不允許重復(fù),主鍵值永不改變。可以使用具有業(yè)務(wù)含義的字段作為主鍵,如COSTOMERS表中的name,但需要滿足上述條件,稱為自然主鍵;也有一種代理主鍵,不具備業(yè)務(wù)含義,一般取名為ID。ID通常為整數(shù)類型,可以定義成自動(dòng)增長(zhǎng)的標(biāo)識(shí)符類型(increment,sequence)。
講到這里,還得提一下java語(yǔ)言按內(nèi)存地址區(qū)分不同對(duì)象,也就是==和equals( ),
??? Customer c1=new Customer("oscar");
??? Customer c2=new Customer("oscar");
??
?? c1= =c2?????????? 返回false
?? c1.equals(c2)?? 返回true
現(xiàn)在我們回過(guò)頭來(lái)再看下Hibernate的OID
??????? Transaction tx=session.beginTranscation();
??????? Customer c1=(Customer) session.load(Customer.class, new long(1));
??????? Customer c2=(Customer) session.load(Customer.class, new long(1));
??????? Customer c3=(Customer) session.load(Customer.class, new long(3));
??????? System.out.println(c1= =c2);
??????? System.out.println(c1= =c3);
(1)第一次加載OID為1的對(duì)象時(shí),是先從數(shù)據(jù)庫(kù)中查詢ID為1的記錄,再創(chuàng)建相應(yīng)的Customer實(shí)例,保存在Session緩存中,最后把這個(gè)對(duì)象的引用賦值給變量c1。
(2)第二次加載OID為1時(shí),直接把緩存中的Customer對(duì)象賦值給c2。
(3)第三持加載OID為3的對(duì)象,由于緩存中不存在,必須再次從數(shù)據(jù)庫(kù)讀取,然后將Customer實(shí)例賦值給c3。
因而輸出,true?????????
??????????????????? false
最后提一下Hibernate的內(nèi)置標(biāo)識(shí)符生成器,increment遞增,identity,由底層數(shù)據(jù)庫(kù)負(fù)責(zé)ID,sequence,也是由底層數(shù)據(jù)庫(kù)負(fù)責(zé),hilo, 按high/low的算法來(lái)生成,native,能自動(dòng)判斷底層數(shù)據(jù)庫(kù)提供的生成標(biāo)識(shí)符的機(jī)制。
posted on 2005-09-20 20:15 天生我才 閱讀(261) 評(píng)論(0) 編輯 收藏 所屬分類: Hibernate