在进行一些数据模型重构之后,我正在进行一些数据迁移,我正在使用复合主键的几个表,并将它们组合成一个更大的表并为其提供自己唯一的主键。此时,我编写了一些SQL来将旧表数据复制到新表中,并使用AUTO_INCREMENT分配主键。迁移完成后,我从PK字段中删除AUTO_INCREMENT。所以,现在这一切都很好,但问题是我需要hibernate序列才能知道下一个可用的PK是什么。我们通常对所有实体使用TABLE策略,并且我希望保持一致,并避免对将来的对象使用AUTO_INCREMENT和IDENTITY策略。我已经暂时将生成的“hibernate_sequences”表中的相应行设置为新创建的表的最大ID,但这只是对问题进行的绑定修复。此外,这会导致创建的下一个ID远大于最大ID。我确定这是因为我不理解HiLo id-assigning机制,这就是我在这里发帖的原因。有没有办法设置它,以便ID顺序?或者,生成HiLo值的代码在哪里,以便我可以计算确保顺序ID的内容?
答案 0 :(得分:2)
如果我理解正确,问题是hibernate不会为您生成序列ID。但这就是hi / lo发电机的工作方式,我不明白为什么你不喜欢它。
基本上,Hi / lo发生器基于分别支持HIGH和LOW值。当LOW达到其极限时,它会复位并且HIGH会递增。结果键基于将HIGH和LOW值组合在一起。例如。假设键是双字,HIGH和LOW是字。 HIGH可以保留两个字节,LOW可以保留两个字节。
ID跳转取决于两个因素 - LOW和on事件的最大值,触发更改HIGH的值。 默认情况下,在Hibernate中,LOW的最大值为Short.MAX_VALUE,并在每次生成器初始化时复位。从表中读取HIGH值并在每次初始化时递增,当LOW达到其上限时,它也会递增。所有这些意味着每次重新启动应用程序时,ID都会有差距。
看一下代码,似乎如果你对max_lo使用值< 1,那么只需通过递增从DB读取的hi值来生成密钥。你可能会喜欢这种行为:)
查看org.hibernate.id.MultipleHiLoPerTableGenerator#generate的源代码
答案 1 :(得分:0)
使用org.hibernate.id.MultipleHiLoPerTableGenerator#generate,我发现我的批次大小为50,因此对于我的目的,使用max id / 50 + 1会产生一个可用的数字来投入序列来制作它们尽可能接近顺序。