不指定@TableGenerator时,GeneratedValue(strategy=GenerationType.TABLE)跳跃的原因是什么?

4

在使用@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个回答

2

Hibernate缓存一块ID是为了提高性能。它从数据库中分配多个ID,保留并使用这些ID,如果用完了,则从序列中分配另一个块(因此增加序列值)。


当使用块大小为1时,持久化对象会影响性能。请注意。 - Justin
@Justin:为什么指定块大小为1会导致性能下降? - n_g
@n_g:每个新对象需要持久化,都需要一个ID,因此Hibernate会对ID表执行select和update操作。如果你增加块大小,Hibernate会缓存(即保留)与该块大小相同的ID数量,并且只有在使用完此缓存时才会查询/更新ID表。 - rudolfson

0

我不是在说一定是这样,但这可能是Hibernate使用的底层生成器中的一个错误。例如,请参见Hibernate论坛上描述奇怪行为的此帖子,以及新(3.2.3)Hibernate标识符生成器的评论中提到的问题或Jira中存在的问题。

我的建议是确定您的情况中使用的生成器,并搜索现有问题或打开一个新问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接