为什么我需要在使用@TableGenerator时添加allocationSize = 1以确保id在jvm重启后不会从1,2,...跳转到32,xxx,65,xxx ...... ?
是否需要指定allocationSize的设计原因?
此代码段将产生跳跃ID
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
这是修改后的代码段,用于生成正确排序的ID
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "account_generator")
@TableGenerator(name = "account_generator", initialValue = 1, allocationSize = 1)
private Long id;
答案 0 :(得分:2)
出于性能原因,Hibernate会缓存一块ID。它从数据库中分配了几个id,保留,如果这些ID用完,它会从序列中分配另一个块(从而增加序列值)
答案 1 :(得分:0)
我没有声称是这种情况,但这可能是Hibernate使用的底层生成器中的一个错误。请参阅Hibernate论坛上的this post,其中描述了一种奇怪的行为,New (3.2.3) Hibernate identifier generators的评论中提到的问题或Jira中的现有问题。
我的建议是识别您的案例中使用的生成器,并搜索现有问题或打开一个新问题。