Hibernate的持久化類使用的是JavaBean的風格為要被訪問的屬性提供了一套get和set方法這兩個方法也叫做持久化類的訪問方法記得曾經在接觸JavaBean的時候我很迷糊總覺得提供這兩個方法倒不如把Bean的屬性設置public然後直接調用對象屬性這樣來的方便但是後來有一個這樣的需求就是一個人名字可以被查看但是不可以修改這個時候如果用set方法的話只需要把set方法的修飾符換為private就OK了如果是用對象屬性的形式調用就麻煩了而且最重要的一個有點是JavaBean的風格可以簡化Hibernate通過JAVA反射機制來獲得持久化類的訪問方法的過程至於JAVA的反射機制我也是了解一些皮毛據說很深奧有興趣的朋友可以Google一下有一點值得注意就是JAVA應用程序不能訪問JavaBean持久化類的private類型的getset方法而Hibernate沒有這個限制可以訪問所有的級別包括private defaultprotectedpublic
Java有種基本類型:byteshortcharintlongfloatdoubleboolean還有種與之對應的包裝類型ByteShortCharacterIntegerLongFloatDoubleBoolean包裝類型就是把基本類型包裝成對象的意思基本類型於包裝類型之間可以方便的轉換例如:
int i = ;
Integer ie = new Integer(i);//基本類型轉換成包裝類型
i = ieintValue();//包裝類型轉化成基本類型
注意直接轉換也是可以的例如i = ie; JAVA會自動把包裝類型轉換成基本類型或者ie = i; JAVA會自動把基本類型轉換成包裝類型在持久化類中既可以把屬性定義為基本類型也可以定義為包裝類型他們對應的Hibernate映射類型int和Integer都對應int類型這個表示不是很明顯在用JAVA對象類型字符串舉例String數據庫是varhcar()在hibernate的*hbmxml映射文件裡一律寫為string其實使用基本類型或者包裝類型來定義持久化類中的屬性是各有優缺點的基本類型就是使用方便簡單在需要數字運算的時候直接可以運算而包裝類型就要麻煩的先轉換成基本類型然後在進行運算但是包裝類型的優點在於能表達null值每一個包裝類型的對象創建的時候默認值都是null類型的而基本類型是不可以表達null的它們的默認值是為什麼要表達null值呢因為SQL中所有類型的數據默認值都是null的當進入insert的時候沒有復值的屬性默認值就是null所以說JAVA的包裝類型和數據庫之間的對應關系更直接這裡建議Hibernate的OID設置為包裝類型其他的屬性就根據業務需要和個人習慣來定吧
Hibernate在初始化階段會根據映射文件的信息為所有的持久化類預定義insert語句update語句where IDdelete語句where IDselect語句where ID這裡所說的語句就是標准的SQL增刪改查語句參數用?代表JDBC PreparedStatement中的參數這裡就不舉例了這些SQL語句都存放在SessionFactory的緩存中當執行Session的save()update()delete()load()方法時將會從SessionFactory的緩存中讀取這些預定義的SQL語句在把具體的參數值綁定到SQL語句中這就是Hibernate的基本原理在默認的情況下這些語句表達的是所有的字段當然Hibernate還允許我們在映射文件裡控制insert和update語句的內容比如在映射文件中<property 元素中的update屬性設置成為false那麼這個字段將不被包括在基本的update語句中修改的時候將不包括這個字段了insert同理dynamic動態SQL語句的配置也是很常用的下面介紹配置SQL語句的具體屬性:
)<property>元素 insert屬性:設置為false在insert語句中不包含這個字段表示永遠不會被插入默認true
)<property>元素 update屬性:設置為false在update語句中不包含這個字段表示永遠不會被修改默認true
)<class>元素 mutable屬性:設置為false就是把所有的<property>元素的update屬性設置為了false說明這個對象不會被更新默認true
)<property>元素 dynamicinsert屬性:設置為true表示insert對象的時候生成動態的insert語句如果這個字段的值是null就不會加入到insert語句當中默認false
)<property>元素 dynamicupdate屬性設置為true表示update對象的時候生成動態的update語句如果這個字段的值是null就不會被加入到update語句中默認false
)<class>元素 dynamicinsert屬性:設置為true表示把所有的<property>元素的dynamicinsert屬性設置為true默認false
)<class>元素 dynamicupdate屬性:設置為true表示把所有的<property>元素的dynamicupdate屬性設置為true默認false
Hibernate生成動態SQL語句的消耗的系統資源(比如CPU內存等)是很小的所以不會影響到系統的性能如果表中包含N多字段建議把dynamicupdate屬性和insert屬性設置為true這樣在插入和修改數據的時候語句中只包括要插入或者修改的字段可以節省SQL語句的執行時間提高程序的運行效率
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28783.html