我们定义了一个Hibernate实体,其中的ID是数字,并由Hibernate根据序列自动分配。出于技术原因,我们不允许通过休眠生成数据模型,而应使用liquibase来启动序列。
我们已经看到了奇怪的行为,休眠状态会重新分配表中已经存在的ID,并且还会将负值分配为ID。
我该怎么办?
答案 0 :(得分:0)
休眠(至少在5.3.7中)在使用序列时假定步长为50。不会对照数据库检查此假设。基本上休眠是从序列中获取下一个值并扣除50,然后分配这些值(X-49,X-48,...)。如果序列的步长小于50,则会看到ID被多次分配。如果您的步长大于50,则会看到不连续的ID。
当您手动初始化序列时,您很可能会执行步骤1。这意味着,您将看到每个ID被分配了50次,并且很可能会看到很多重复键错误。
您可以将序列中的步长设置为50,或者使用@SequenceGenerator
批注并使用allocationSize
属性来匹配自定义序列的步长。