Hibernate 中持久化類:
1、什麼是持久化類:
- 持久化:將內存中的一個對象持久化到數據庫中,hibernate就是用來持久化的框架;
- 持久化類:一個java文件和數據庫表建立了映射關係,那麼這個類在hibernate中就稱爲持久化類。簡單的說持久化類=Java類+映射文件;
2、持久化類的編寫規則:
- 對持久化類提供一個無參數的構造函數;(hibernate需要通過反射來生成對象的實例)
- 屬性私有化,提供公有的get和set方法;(hibernate 要通過該方法來獲取和設置對象的值)
- 對持久化類提供一個唯一標識OID與數據庫主鍵對應;(Java中通過對象的地址來區分是否是同一個對象,數據庫中通過OID來區分是否是同一條記錄,在hibernate中通過對象的OID來區分是否是同一個對象)
- 持久化類中儘量使用包裝類類型; (因爲基本數據類型默認值是0,0會有歧義,例如該項是沒有值還是值爲0,而包裝類類型默認值 是null,則不存在歧義)
- 持久化類不要用finall修飾; (因爲延遲加載本來就是hibernate的一種優化手段,返回的是一個代理對象(javassist可以對沒有實現接口的類產生代理,jdk動態代理只能對實現了接口的類進行代理,javassist使用了非常底層的字節碼增強技術,繼承持久化類來產生代理對象的,如果用final修飾則該類不能被繼承,則不會延遲加載,hibernate的get方法和load方法作用會完全相同)
3、持久化類的三種狀態
- 瞬時態:這種對象沒有唯一的標識OID,沒有被session管理;
- 持久態:有唯一的標識OID,且被session管理;(持久態的對象會自動更新到數據庫中)
- 脫管態:有唯一的標識OID,但是不被session管理;
例如:Student stu=new Student(); stu處於瞬時態
stu.setId("1");
session.save(stu); 此時stu處於持久態
tx.commit();
session.close(); 此時stu處於託管態
Hibernate 的主鍵生成策略
1、主鍵的分類:
- 自然主鍵:主鍵的本身就是表中的一個字段;
- 代理主鍵:主鍵本身不是表中的一個字段;
2、主鍵生成策略:
- increment: hibernate提供的自增長機制,適用於short,int,long類型的主鍵,在單線程中使用;(原理:select max(id) from 表作爲下一條記錄的主鍵)
- identity: 適用於short,int,long類型的主鍵,使用的是數據庫底層的自增長機制,適用於有自增長機制的數據庫(Mysql),Oracle沒有自增長;
- sequence: 適用於short,int,long類型的主鍵,採用的是序列的方式;(Oracle支持序列)
- uuid: 適用於字符串類型的主鍵,它是由hibernate中隨機生成的字符串主鍵;
- native: 本地策略;可以在identity和sequence之間自由切換;
- assigned: hibernate放棄外鍵的管理,需要手動編寫程序或用戶自己設置;
- foreign: 外部的。一對一的關聯映射下使用;