在没有指定@TableGenerator时跳转GeneratedValue(strategy = GenerationType.TABLE)背后的原因是什么?

时间:2010-05-24 06:48:34

标签: java hibernate jpa

为什么我需要在使用@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;

2 个答案:

答案 0 :(得分:2)

出于性能原因,Hibernate会缓存一块ID。它从数据库中分配了几个id,保留,如果这些ID用完,它会从序列中分配另一个块(从而增加序列值)

答案 1 :(得分:0)

我没有声称是这种情况,但这可能是Hibernate使用的底层生成器中的一个错误。请参阅Hibernate论坛上的this post,其中描述了一种奇怪的行为,New (3.2.3) Hibernate identifier generators的评论中提到的问题或Jira中的现有问题。

我的建议是识别您的案例中使用的生成器,并搜索现有问题或打开一个新问题。