1 映射關係總覽
①單類→單表
②單向n對1
③雙向1對n
④1對1基於外鍵
⑤1對1基於主鍵
⑥單向多對多
⑦雙向多對多java
2 單類→單表的映射
①映射主鍵
②映射日期類型
③映射大對象
④hbm文件中的其餘屬性
⑤數據類型映射對照表git
3 Hibernate中主鍵生成方式
3.1 increment
①由Hibernate以遞增的方式爲代理主鍵賦值
②Hibernate會先讀取數據庫表中的主鍵的最大值,插入記錄時以最大值+1做爲主鍵
③不依賴底層數據庫系統,因此適合各類類型的數據庫
④在多線程模式下運行時,很容易發生錯誤(多個線程可能獲取數據庫表中的主鍵的最大值相同,都以最大值+1做爲主鍵向數據庫表中插入記錄,致使插入到數據庫表中的多條記錄的主鍵相同,從而違反了數據庫表中主鍵的惟一性,故會報錯)
⑤OID必須爲long、int或short類型,若是爲byte則會拋出異常
3.2 hilo
①由Hibernate根據high/low算法生成主鍵
②hilo標識符生成器在生成標識符時,須要讀取並修改HI_TABLE表中的NEXT_VALUE值
③徹底不依賴於任何數據庫系統
④OID必須爲long、int或short類型,若是爲byte則會拋出異常程序員
<generator class= "hilo"> <param name= "table">HL_table </param> <param name= "column">NEXT_VALUE </param> <param name= "max_lo">10</param > </generator>
⑤高低算法github
參見:我寫的博客:Hibernate - 高低算法算法
3.3 identity
①由具體數據庫負責生成主鍵
②要求數據庫將主鍵定義爲自動增加類型
③支持自增主鍵的數據庫:MySQL、DB二、微軟SQLServer、Sybase等;
可是有侷限性,由於Oracle不支持;
④OID必須爲long、int或short類型,若是爲byte則會拋出異常sql
3.4 sequence
①利用底層的數據庫提供的序列生成標識符
②要求底層數據庫支持序列:DB二、Oracle
③OID必須爲long、int或short類型,若是爲byte則會拋出異常
④配置方式數據庫
<id name ="studentId" type="java.lang.Integer"> <column name ="STUDENTID" /> <generator class ="sequence"> <param name ="sequence">stu_seq</ param> </generator > </id >
3.5 native
①依據底層數據庫對自動生成標識符的支持能力,來選擇使用identity、sequence或hilo
②因爲native標識符生成器可以根據底層數據庫系統的類型,自動選擇合適的方式生成主鍵,因此很是適合跨數據庫平臺開發
③OID必須爲long、int或short類型,若是爲byte則會拋出異常session
3.6 assigned(指定的)
Hibernate和數據庫都不負責生成主鍵的值,徹底由程序員本身指定。
3.7 其餘主鍵生成方式
select、seqhilo、foreign、guid等等
4 在Hibernate中映射日期和時間
4.1 Java數據類型和JDBC API的對應關係多線程
注:時間戳:從1970年1月1日0點0時0分0秒開始計時,到當前時間所通過的毫秒數app
4.2 Hibernate中的日期映射方式
大部分狀況下Hibernate能夠根據Java類型自動找到對應的Hibernate映射類型,從而肯定數據庫表中的字段類型,但若是一個Java類型對應的Hibernate映射類型不僅一個,那麼就必須爲Java類型明確指定Hibernate映射類型,例如:
5 Java中大對象類型的Hibernate映射
5.1 大對象
①長字符串:長度超過255的字符串
②二進制數據:圖片、音頻、視頻等文件
5.2 Java中的大對象類型
①長字符串
[1]java.lang.String[推薦]
[2]java.sql.Clob——Character Large Object,對應SQL標準類型中的CLOB
②二進制數據
[1]java.sql.Blob——Binary Large Object,對應SQL標準類型中的BLOB(推薦)
[2]byte[]
5.3 MySQL不支持標準SQL的CLOB類型
①TEXT
②MEDIUMTEXT
③LONGTEXT
5.4 精確映射SQL類型
①使用Hibernate映射大對象
<property name= "content" type ="text"/>在MySQL中生成的字段類型:longtext <property name= "photo" type ="blob"/>在MySQL中生成的字段類型:longblob
②精確指定SQL類型
<property name= "content" type ="text"> <column name ="my_content" sql-type="mediumtext" /> </property> <property name= "photo" type ="blob"> <column name ="my_photo" sql-type="mediumblob" /> </property>
5.5 使用Hibernate工具類建立大對象
FileInputStream in = new FileInputStream( "chain.jpg"); Blob photo = Hibernate.getLobCreator(session ).createBlob(in, in.available());
5.6 經過大對象獲取輸入流
InputStream in = photo.getBinaryStream(); OutputStream out = new FileOutputStream( "bingbing.jpg"); byte [] b = new byte[1024]; int len = 0; while((len = in.read(b)) != -1){ out.write(b, 0, len); } in.close(); out.close();
附:MySQL中四種BLOB類型的最大範圍
6 Hibernate映射類型對照表
7 對象關係映射文件
7.1 Hibernate使用*.hbm.xml文件定義持久化類和數據庫表之間的映射關係,並以這個文件爲依據生成各類SQL語句
7.2 映射關係
①持久化類:數據庫表
②持久化類屬性:數據庫表中的字段
7.3 經常使用設置
7.4 元素屬性說明
元素 | 屬性 | 說明 |
hibernate-mapping | schema | 指定所映射的數據庫schema的名稱。若指定該屬性,則代表會自動添加該 schema前綴 |
catalog | 指定所映射的數據庫catalog的名稱 | |
default-cascade | 默認值爲none。設置hibernate默認的級聯風格。若配置Java屬性,集合映射時沒有指定cascade屬性,則Hibernate 將採用此處指定的級聯風格 | |
default-access | 默認爲property。指定Hibernate的默認的屬性訪問策略。默認值爲property,即便用getter,setter方法來訪問屬性。若指定access,則Hibernate會忽略getter/setter方法,而經過反射直接訪問成員變量。 | |
default-lazy | 默認值爲true。設置Hibernat的延遲加載策略。該屬性的默認值爲true,即啓用延遲加載策略。若配置Java屬性映射,集合映射時沒有指定lazy屬性,則Hibernate將依據這一設定使用延遲加載策略 | |
auto-import | 默認值爲true。指定是否能夠在查詢語言中使用非全限定的類名(僅限於本映射文件中的類)。 | |
package | 指定一個包前綴,若是在映射文檔中沒有指定全限定的類名,就使用這個做爲包名。 | |
class | name | 指定該持久化類映射的持久化類的類名 |
table | 指定該持久化類映射的表名,Hibernate默認以持久化類的類名做爲表名 | |
dynamic-insert | 若設置爲true,表示當保存一個對象時,會動態生成insert語句,insert語句中僅包含全部取值不爲null的字段。默認值爲false。 | |
dynamic-update | 若設置爲true,表示當更新一個對象時,會動態生成update語句,update語句中僅包含全部取值須要更新的字段。默認值爲false | |
select-before-update | 設置Hibernate在更新某個持久化對象以前是否須要先執行一次查詢。默認值爲false | |
batch-size | 指定根據OID來抓取實例時每批抓取的實例數 | |
lazy | 指定是否使用延遲加載 | |
mutable | 若設置爲true,等價於全部的<property>元素的update屬性爲 false,表示整個實例不能被更新。默認爲true。 | |
discriminator-value | 指定區分不一樣子類的值。當使用<subclass/>元素來定義持久化類的繼承關係時須要使用該屬性 | |
id | name | 標識持久化類OID的屬性名 |
column | 設置標識屬性所映射的數據表的列名(主鍵字段的名字) | |
unsaved-value | 若設定了該屬性,Hibernate會經過比較持久化類的OID值和該屬性值來區分當前持久化類的對象是否爲臨時對象 | |
type | 指定Hibernate映射類型。Hibernate映射類型是Java類型與SQL類型的橋樑。若是沒有爲某個屬性顯式設定映射類型,Hibernate會運用反射機制先識別出持久化類的特定屬性的Java類型,而後自動使用與之對應的默認的Hibernate映射類型。Java的基本數據類型和包裝類型對應相同的Hibernate映射類型。基本數據類型沒法表達null,因此對於持久化類的OID推薦使用包裝類型。 | |
generator | class | 標識符生成器全類名或簡單類名 |
property | name | 指定該持久化類的屬性的名字 |
column | 指定與類的屬性映射的表的字段名。若是沒有設置該屬性,Hibernate將直接使用類的屬性名做爲字段名 | |
type | 指定Hibernate映射類型。Hibernate映射類型是Java類型與SQL類型的橋樑。若是沒有爲某個屬性顯式設定映射類型,Hibernate會運用反射機制先識別出持久化類的特定屬性的Java類型,而後自動使用與之對應的默認的Hibernate映射類型 | |
not-null | 若該屬性值爲true,代表不容許爲null,默認爲false——? | |
access | 指定Hibernate的默認的屬性訪問策略。默認值爲property,即便用getter/setter方法來訪問屬性。若指定field,則Hibernate會忽略getter/setter方法,而經過反射訪問成員變量 | |
unique | 設置是否爲該屬性所映射的數據列添加惟一約束 | |
index | 指定一個字符串的索引名稱。當系統須要Hibernate自動建表時,用於爲該屬性所映射的數據列建立索引,從而加快該數據列的查詢。 | |
length | 指定該屬性所映射數據列的字段的長度 | |
scale | 指定該屬性所映射數據列的小數位數,對double,float,decimal等類型的數據列有效 | |
formula | 設置一個SQL表達式,Hibernate將根據它來計算出派生屬性的值 |
8 派生屬性
①概念:並非持久化類的全部屬性都直接和表的字段匹配。持久化類的有些屬性的值必須在運行時經過計算才能得出來,這種屬性稱爲派生屬性。
②formula屬性
[1]formula=「(sql)」的英文括號不能少
[2]SQL表達式中的列名和表名都應該和數據庫對應,而不是和持久化對象的屬性對應
[3]若是須要在formula屬性中使用參數,可直接使用where cur.id=id 形式,其中id就是參數,和當前持久化對象的id屬性對應的列的id值將做爲參數傳入
GitHub地址:https://github.com/leebingbin/