1. 程式人生 > >hibernate是如何區分兩個對象是不是同一個的

hibernate是如何區分兩個對象是不是同一個的

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是如何區分兩個對象是不是同一個的