天生我才

          常用鏈接

          統計

          最新評論

          Hibernate中的主鍵釋疑

          hibernate的配置文件字段是必備的,剛剛看的時候一直疑惑,id字段是怎么和數據庫表關聯的,為什么一定得給表一個額外的字段?

          其實,java語言按內存地址來識別或區分一個類的不同對象,而關系數據庫按主鍵值來區分同一個表的不同記錄,hibernate使用對象標識符(OID)來建立內存中的對象和數據庫表中記錄的對應關系,為保證OID的唯一性,應讓hibernate而不是應用程序為其賦值。

          作為主鍵的字段必須不為空,不允許重復,主鍵值永不改變。可以使用具有業務含義的字段作為主鍵,如COSTOMERS表中的name,但需要滿足上述條件,稱為自然主鍵;也有一種代理主鍵,不具備業務含義,一般取名為ID。ID通常為整數類型,可以定義成自動增長的標識符類型(increment,sequence)。

          講到這里,還得提一下java語言按內存地址區分不同對象,也就是==和equals( ),

          ??? Customer c1=new Customer("oscar");
          ??? Customer c2=new Customer("oscar");
          ??
          ?? c1= =c2?????????? 返回false
          ?? c1.equals(c2)?? 返回true

          現在我們回過頭來再看下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的對象時,是先從數據庫中查詢ID為1的記錄,再創建相應的Customer實例,保存在Session緩存中,最后把這個對象的引用賦值給變量c1。
          (2)第二次加載OID為1時,直接把緩存中的Customer對象賦值給c2。
          (3)第三持加載OID為3的對象,由于緩存中不存在,必須再次從數據庫讀取,然后將Customer實例賦值給c3。

          因而輸出,true?????????
          ??????????????????? false

          最后提一下Hibernate的內置標識符生成器,increment遞增,identity,由底層數據庫負責ID,sequence,也是由底層數據庫負責,hilo, 按high/low的算法來生成,native,能自動判斷底層數據庫提供的生成標識符的機制。

          posted on 2005-09-20 20:15 天生我才 閱讀(267) 評論(0)  編輯  收藏 所屬分類: Hibernate

          主站蜘蛛池模板: 四会市| 西昌市| 通城县| 阿荣旗| 富民县| 高尔夫| 武宣县| 留坝县| 嘉定区| 正宁县| 临夏市| 兴海县| 出国| 类乌齐县| 伊吾县| 庄浪县| 商洛市| 潼南县| 都昌县| 南投县| 昌都县| 南陵县| 综艺| 清丰县| 廊坊市| 临澧县| 屏东市| 永城市| 施秉县| 神池县| 信阳市| 弥勒县| 七台河市| 延安市| 都安| 广宗县| 汽车| 廊坊市| 滦南县| 稷山县| 海兴县|