天生我才

          常用鏈接

          統計

          最新評論

          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 天生我才 閱讀(261) 評論(0)  編輯  收藏 所屬分類: Hibernate

          主站蜘蛛池模板: 多伦县| 平邑县| 鹤岗市| 太仆寺旗| 三明市| 连城县| 城固县| 怀远县| 泸州市| 娄烦县| 广宁县| 凉城县| 扎兰屯市| 东乌| 闵行区| 永嘉县| 铜鼓县| 新化县| 西贡区| 南投县| 克什克腾旗| 华蓥市| 宁明县| 贞丰县| 钦州市| 泸水县| 赤水市| 平江县| 晋江市| 临汾市| 花莲县| 宜兴市| 珠海市| 崇义县| 凯里市| 水富县| 卓尼县| 会昌县| 上高县| 南充市| 同心县|