在數據庫中區分兩條數據是否是同一條,靠的是主鍵pk
在jvm中,有一塊內存區域叫hibernate內存,jvm中并hibernate內存外面是可以存在多個相同的對象的,區分兩個對象是否是同一個對象靠的是地址(object中的equals方法,)在hibernate內存中靠的是什么呢?
oid對象唯一標示符
oid的使用原則:讓hibernate使用數據庫的能力去維護
Hibernate中定義的主鍵類型包括:自然主鍵和代理主鍵:
自然主鍵:具有業務含義 字段 作為主鍵,比如:學號、×××號
代理主鍵:不具有業務含義 字段作為主鍵(例如 自增id),比如:mysql自增主鍵,oracle序列生成的主鍵、uuid()方法生成的唯一序列串
我一般采用代理主鍵
在hbm.xml中可以設置的主鍵生成策略如下:
increment 代理主鍵。
由hibernate維護一個變量,每次生成主鍵時自動以遞增。
問題:如果有多個應用訪問一個數據庫,由于每個應用維護自己的主鍵,所以此時主鍵可能沖突。建議不采用。
hibernate會先去數據庫查詢主鍵是多少,然后再自增,然后給實體類賦值,在去插入,這樣就會有線程安全問題,如果兩個人在同時插入數據,那么很有可能,有一個人插入失敗
identity 代理主鍵。
由底層數據庫生成表識符。條件是數據庫支持自動增長數據類型。比如:mysql的自增主鍵,oracle不支持主鍵自動生成。
如果數據庫支持自增建議采用。
sequence 代理主鍵。
Hibernate根據底層數據庫序列生成標識符。條件是數據庫支持序列。比如oracle的序列。
如果數據庫支持序列建議采用。
native 代理主鍵。
根據底層數據庫對自動來選擇identity、sequence、hilo
由于生成主鍵策略的控制權由hibernate控制,所以不建議采用。
uuid 代理主鍵。
Hibernate采用128位的UUID算法來生成標識符。該算法
能夠在網絡環境中生成唯一的字符串標識符。
此策略可以保證生成主鍵的唯一性,并且提供了最好的數據庫插入性能和數據庫平臺的無關性。
建議采用。
assigned 自然主鍵。
由java程序負責生成標識符。
不建議采用。
hilo 代理主鍵。
使用高低位算法生成主鍵。必須是long、int、short類型。該算法生成的標識符只能在一個數據庫中保證唯一。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。