天生我才

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          Hibernate中的主鍵釋疑

          hibernate的配置文件字段是必備的,剛剛看的時(shí)候一直疑惑,id字段是怎么和數(shù)據(jù)庫(kù)表關(guān)聯(lián)的,為什么一定得給表一個(gè)額外的字段?

          其實(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


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 昂仁县| 麻江县| 达日县| 黄冈市| 滨海县| 咸阳市| 张家川| 全南县| 马边| 安平县| 宁德市| 揭西县| 西安市| 陇西县| 紫阳县| 龙泉市| 建德市| 社会| 西宁市| 宣恩县| 闽清县| 墨玉县| 大方县| 汝南县| 揭东县| 七台河市| 红安县| 恭城| 屏山县| 平湖市| 抚远县| 南投县| 无锡市| 甘德县| 济源市| 恩施市| 长海县| 罗源县| 东平县| 定安县| 中江县|