OID映射對象標識符
OID存在的意義
關(guān)系型數(shù)據(jù)庫通過主鍵來區(qū)分同一張表的不同數(shù)據(jù),java語言使用內(nèi)存地址來區(qū)分同一類的不同對象修械,hibernate則使用OID來同一兩者之間的矛盾崔泵,在運行時规丽,hibernate通過OID來維持java對象和數(shù)據(jù)庫表中記錄的對應關(guān)系。
OID的配置
在hibernate映射文件中配置猎贴,使用<id>元素來設置對象標識符
<id name="id" type="java.lang.Integer">
<column name="id"/>
<generator class="increment"/>
</id>
<generator>子元素來設定標識符生成器瘟檩,標識符生成器的接口為org.hibernate.id.IdentifierGenerator接口,以及提供了幾種內(nèi)置的實現(xiàn)
- increment Hibernate以遞增的方式賦值 先查該表的id最大值安接,再加一 存在并發(fā)問題
- identity 由底層數(shù)據(jù)庫生成,需要把主鍵設置為自增的(需要底層數(shù)據(jù)庫支持自增 如DB2英融、Mysql盏檐、SQL SERVER)
- sequence 底層數(shù)據(jù)庫序列生成(需要底層數(shù)據(jù)庫支持序列 如Oracle、DB2驶悟、PostgreSQL)
- hilo 由hibernate按照一種high/low算法生成胡野,hibernate把特定表的字段最為high值。默認為hibernate_unique_key表的next_hi字段 注意:hilo的方式需要在單獨的事務中處理痕鳍,不使用session對象的當前數(shù)據(jù)庫連接和事務硫豆,而是單獨的在一個新的數(shù)據(jù)庫連接中創(chuàng)建新的事務,與spring結(jié)合時以及配置數(shù)據(jù)源時注意不可使用該方式生成
- native 根據(jù)底層數(shù)據(jù)庫對自動生成主鍵的支持能力额获,來選擇identity,sequence或hilo生成器
- uuid.hex hibernate采用128位的UUID生成
- assigned 由java程序負責生成
- select 由數(shù)據(jù)庫中的觸發(fā)器來生成
- foreign 用另一個關(guān)聯(lián)對象的標識符來作為當前對象的標識符够庙,主要用于一對一關(guān)聯(lián)關(guān)系
復合主鍵的配置
復合主鍵的配置使用<composite-id>
<composite-id>
<key-property name="name" column="name" type="java.lang.String"/>
<key-property name="companyId" column="company_id" type="java.lang.Long"/>
</composite-id>
注意在使用復合主鍵時恭应,需要定義version版本控制屬性抄邀,用來區(qū)分臨時對象和游離對象,判斷是保存還是更新
<!-- 表示當對象的version對象為null時為游離對象昼榛,還沒有被保存過 -->
<version name="version" column="version" unsaved-value="null"/>
由于本身的博客百度沒有收錄境肾,博客地址http://zhhll.icu