Hibernate中的主鍵釋疑
hibernate的配置文件其實,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 天生我才 閱讀(258) 評論(0) 編輯 收藏 所屬分類: Hibernate