簡體   English   中英

如何在 mysql 中手動設置休眠序列?

[英]How do I set a hibernate sequence manually in mysql?

在進行了一些數據模型重構之后,我正在進行一些數據遷移,我正在使用幾個帶有復合主鍵的表,並將它們組合成一個更大的表,並為其提供自己唯一的主鍵。 此時,我已經編寫了一些 SQL 來將舊表數據復制到新表中,並使用 AUTO_INCREMENT 分配主鍵。 遷移完成后,我從 PK 字段中刪除了 AUTO_INCREMENT。 所以,現在這一切都是肉汁,但問題是我需要休眠序列來知道下一個可用的 PK 將是什么。 我們通常對所有實體使用 TABLE 策略,我希望保持一致並避免對未來的對象使用 AUTO_INCREMENT 和 IDENTITY 策略。 我暫時將生成的“hibernate_sequences”表中的相應行設置為新創建表的最大 id,但這只是解決問題的創可貼。 此外,這會導致創建的下一個 ID 比最大 ID 大得多。 我確定這是因為我不了解 HiLo id 分配機制,這就是我在這里發帖的原因。 有沒有辦法設置它以便 Id 是連續的? 或者,生成 HiLo 值的代碼在哪里,以便我可以計算應該是什么來確保順序 ID?

如果我理解正確,問題是 hibernate 不會為您生成連續的 ID。 但這就是 hi/lo 生成器的工作原理,我不明白您為什么不喜歡它。

基本上,Hi/lo 生成器基於分別支持 HIGH 和 LOW 值。 當 LOW 達到其限制時,它會被重置,而 HIGH 會遞增。 結果鍵基於將 HIGH 和 LOW 值組合在一起。 例如,假設 key 是雙字,而 HIGH 和 LOW 是字。 HIGH 可以留兩個字節,LOW 可以留兩個字節。

ID 中的跳轉取決於兩個因素 - LOW 的最大值和觸發更改 HIGH 值的事件。 默認情況下,在 Hibernate 中,LOW 的最大值是 Short.MAX_VALUE 並且在每次生成器初始化時重置。 HIGH 值從表中讀取並在每次初始化時遞增,當 LOW 達到上限時也會遞增。 所有這一切意味着,在您的應用程序每次重新啟動時,您的 ID 都會出現間隙。

查看代碼,似乎如果您將 value <1 用於 max_lo,則密鑰將僅通過增加從 DB 讀取的 hi 值來生成。 你可能會喜歡這種行為:)

查看 org.hibernate.id.MultipleHiLoPerTableGenerator#generate 的源代碼

使用org.hibernate.id.MultipleHiLoPerTableGenerator#generate ,我發現我的批次大小為 50,因此出於我的目的,使用 max id / 50 + 1 生成了一個可用的數字以投入序列以使它們盡可能接近盡可能連續。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM