Hibernate配置文件詳解-1
前言:
通過前面的學習我們已經掌握了Hibernate的基本使用,今天我們來繼續學習Hibernate配置文件詳解。
hbm.xml配置實體關係映射。
代碼:
首先設置連接資料庫的基本信息:
接下來集成C3P0,設置資料庫連接池信息:
資料庫連接信息配置完成,配置Hibernate的基本信息:
1.update:Hibernate初始化時檢測實體關係映射文件對應的數據表是否已經創建,如果沒有創建,則創建數據表,如果已經創建,直接使用創建好的數據表,實際開發中常用。
2.create:Hibernate初始化時會創建新的數據表,如果數據表已經存在,直接刪除重新創建,會造成數據丟失,實際開發中不用。
3.create-drop:Hebarinate初始化時創建數據表,程序運行結束的時候會刪除相應的數據表,在實際開發中不用。
4.validate:校驗實體關係映射文件和資料庫表是否對應,不能對應直接報錯,實際開發中常用。
需要注意的是路徑中的包名的層級關係用/而不是我們習慣性的.
是為了與文件名的後綴區分。
2.實體關係映射文件詳解
hibernate-mapping標籤:根節點,每一個hbm.xml文件只有一個根節點。
屬性:
package:給class節點對應的實體類統一設置包名,此處設置包名,class的name屬性就可省略包名。
schema:資料庫schema的名稱
catalog:資料庫catalog的名稱
default-cascade:默認的級聯風格,默認為none
default-access:Hibernate用來訪問屬性的策略
default-lazy:指定了未明確註明lazy屬性的Java屬性和集合類,Hibernate會採取什麼樣的默認載入風格,默認為true。
auto-import:指定我們是否可以在查詢語言中使用非全限定的類名,默認為true,如果項目中有兩個同名的持久化類,則最好在這兩個類的對應的映射文件中配置為false
class標籤:配置實體類與數據表的映射關係。
屬性:
name:實體類名。
table:對應資料庫表名。
discriminator-value:默認和類名一樣,一個用於區分不同的子類的值,在多態行為時使用。
mutable:表明該類的實例是可變的或者是不可變的。
schema:覆蓋根元素中指定的schema名字。
catalog:覆蓋根元素中指定的catalog名字。
proxy:指定一個介面,在延遲裝載時作為代理使用。
dynamic-update:動態更新,默認值為false。
開啟動態更新,以修改news對象為例,news對象有4個屬性:id,title,author,createTime。
若只修改其title屬性,則SQL語句如下。
可以看到SQL語句中只是對title一個欄位進行了修改。
若將該屬性設置為false,表示關閉動態更新,再一次執行上述代碼,看到結果如下。
會看到3個欄位全部被重新賦值,當然只有title是有意義的,author和createTime等於沒有修改。
很顯然動態更新效率更高。
dynamic-insert:原理同dynamic-update,即是否對數據進行動態添加,默認值為false。
以添加news為例,開啟動態添加,當只給title屬性賦值時,sql語句如下。
SQL語句只添加了title一個欄位的值,其他欄位全部為默認值。
若關閉動態添加,即將dynamic-insert的值設置為false,同樣再次執行上述代碼,看到SQL如下。
可以看到SQL語句給title,author,createTime3個欄位全部賦值,當然只有title的值是有意義的,其他兩個欄位的值全部為null。
很顯然,動態添加效率更高。
select-before-update:指定HIbernate除非確定對象真正被修改了(如果該值為true),否則不會執行SQL UPDATE操作。在特定場合(實際上,它只在一個瞬時對象關聯到一個新的Session中時執行的update()中生效),這說明Hibernate會在UPDATE之前執行一次額外的SQL SELECT操作,來決定是否應該執行UPDATE。
polymorphism:多態,界定是隱式還是顯式的多態查詢
where:查詢時給SQL增加WHERE條件。
以查詢news對象為例,使用hql進行查詢,如果不設置where條件,會將資料庫中所有的3條記錄全部查詢出來。
添加where條件 id = 3。
再次執行上述代碼,結果如下。
只查詢出了id=3的記錄。
persister:指定一個定製的ClassPersister。
batch-size:指定一個用於根據標識符(identifier)抓取實例時使用的"batch size"(批次抓取數量)。
optimistic-lock:樂觀鎖定,決定樂觀鎖定的策略。
lazy:設置延遲載入策略。
abstract:用於在的繼承結構(hierarchies)中標識抽象超類。
id標籤:設置數據表的主鍵與實體類屬性的映射OID。
屬性:
name:實體類屬性名。
type:數據類型。
此處可以設置兩種類型的數據:Java數據類型或者Hibernate映射類型。
實體類的屬性數據類型必須與數據表對應的欄位數據類型一致:
如int對應int,String對應varchar。
如何進行映射呢?
首先Java數據類型關聯到Hibernate映射類型,再由Hibernate映射類型關聯到SQL數據類型。
Java-->Hibernate-->SQL
關聯關係如下圖。
column:資料庫表的主鍵欄位名。
unsaved-value:用來標誌該實例是剛剛創建的,尚未保存。可以用來區分對象的狀態。
access:Hibernate用來訪問屬性值的策略。
generator:設置主鍵的生成策略。
Hibernate提供如下生成器:
1.assigned演算法
2.hilo演算法
3.seqhilo演算法
4.increment:Hibernate層面的自增。
5.identity:資料庫層面的自增,要求底層資料庫必須支持自增
6.sequence:要求底層資料庫必須支持序列。
7.native:本地策略,自動根據底層資料庫選擇對應的生成策略,如MySQL會使用自增,Oracle使用序列。
8.uuid.hex演算法
9.uuid.string演算法
10.foregin演算法
11.select演算法
property:設置普通屬性與欄位的映射。
屬性:
name:實體類的屬性名。
column:資料庫表的欄位名。
type:數據類型。
update:表示該欄位是否可以被修改,默認為true。
insert:表示是否可以添加該欄位,默認為true。
formula:一個SQL表達式,定義了這個計算屬性的值。
access:Hibernate用來訪問屬性值的策略。
lazy:延遲載入策略。
unique:表示該欄位是否唯一,默認為false。
not-null:該欄位是否可以為null,默認為true。
optimistic-lock:指定這個屬性在進行更新時是否需要獲得樂觀鎖定(換句話說,它決定這個屬性發生臟數據時版本version的值是否增長)。
總結:
今天我們將Hibernate的配置詳解做了一個梳理,基本涵蓋了所有的配置方式,但是在實際開發中,並不是需要用到所有的配置,還是需要根據具體的業務需求來選擇對應的配置。
下一篇:Hibernate配置文件詳解-2
專業 熱愛 專註
致力於最高效的Java學習
Java大聯盟
TAG:前端開發隨筆 |