hibernate是如何區分兩個對象是不是同一個的
阿新 • • 發佈:2018-03-07
oid
我一般采用代理主鍵
在數據庫中區分兩條數據是否是同一條,靠的是主鍵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類型。該算法生成的標識符只能在一個數據庫中保證唯一。
hibernate是如何區分兩個對象是不是同一個的