Hibernate<三>-ORM映射:單表映射

 

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/  

相關文章
相關標籤/搜索