【SSH】SSH之Hibernate框架:Hibernate的主鍵生成策略

主鍵:

自然主鍵:用表中一個有實際意義的字段(對應持久化類中的一個有實際意義的屬性)來作爲主鍵,例如創建的一個人員表,用人員的身份證號作爲主鍵。
代理主鍵:不是表中一個有實際意義的字段,它的存在僅僅是用來作爲每條記錄的唯一標識。在設置主鍵的時候通常用代理主鍵,因爲自然逐漸是一個有實際意義的字段,有可能會更改,而代理主鍵沒有實際意義,不存在後續更改的情況。

Hibernate的代理主鍵生成策略:

在實際開發中一般不允許用戶設置主鍵,而是由程序自動生成,Hibernate提供的的主要的主鍵生成策略有以下幾種:

  • increment:適用short、int、long類型的主鍵,實現原理是首先發送一個sql語句查詢表中最大的id,然後將該id+1作爲新紀錄的id。從原理可以看到該方法存在線程安全問題,因爲如果是多個線程同時操作時,新的記錄還沒插入表中,新的線程就查詢到了還沒增加的id,此時該線程也會生成一個與上一個線程相同的id,就會發生id衝突。因此,該方法應在單線程中使用。
  • identity:適用short、int、long類型的主鍵,使用的是數據庫底層的自動增長機制,因此不會出現線程安全問題。但是應該注意的是,DB2,MySQL,MS SQL Server,Sybase 和 HypersonicSQL 等數據庫有自動增長機制,而Oracle沒有。
  • sequence:適用short、int、long類型的主鍵,DB2,PostgreSQL,Oracle,SAP DB,McKoi 等數據庫使用序列(sequence), 而MySQL不支持序列,不能使用sequence。
  • uuid:適用String類型的主鍵,使用該主鍵生成策略後,Hibernate會自動生成隨機字符串作爲主鍵。
  • native:本地策略,本地用的MySQL數據庫則使用identity策略,本地用的是Oracle數據庫則使用sequence策略。
  • assigned:如果使用該策略,則hibernate會放棄對主鍵的生成管理,讓應用程序在調用 save() 之前爲對象分配一個標識符。這是 <generator> 元素沒有指定時的 默認生成策略。此時需要通過編寫程序生成或用戶自己來設置。
  • foreign:使用另外一個相關聯的對象的標識符。它通常和 <one-to-one> 聯合起來使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章