Hibernate 从序列中提取有趣的错误
Hibernate extracts funny falues from sequence
我们定义了一个 Hibernate 实体,其中 ID 是数字,由 Hibernate 根据序列自动分配。由于技术原因,我们不允许我们的数据模型由 hibernate 生成,而是使用 liquibase 来启动序列。
我们看到了奇怪的行为,其中 hibernate 重新分配 table 中已经存在的 ID,并将负值分配为 ID。
我能做什么?
Hibernate(至少在 5.3.7 中)在使用序列时假定步长为 50。不会针对数据库检查此假设。基本上,hibernate 从序列中获取下一个值并减去 50,然后分配这些值(X-49、X-48、...)。如果您的序列的步长小于 50,您会看到 ID 被分配了多次。如果您的步长大于 50,您将看到 non-continous 个 ID。
当您手动初始化序列时,您的步长很可能为 1。这意味着,您将看到每个 ID 被分配 50 次,并且很可能您会看到很多 duplicate-key 错误。
要么将序列中的步骤设置为 50,要么使用 @SequenceGenerator
注释并使用 allocationSize
属性来匹配 self-defined 序列的步骤。
我们定义了一个 Hibernate 实体,其中 ID 是数字,由 Hibernate 根据序列自动分配。由于技术原因,我们不允许我们的数据模型由 hibernate 生成,而是使用 liquibase 来启动序列。
我们看到了奇怪的行为,其中 hibernate 重新分配 table 中已经存在的 ID,并将负值分配为 ID。
我能做什么?
Hibernate(至少在 5.3.7 中)在使用序列时假定步长为 50。不会针对数据库检查此假设。基本上,hibernate 从序列中获取下一个值并减去 50,然后分配这些值(X-49、X-48、...)。如果您的序列的步长小于 50,您会看到 ID 被分配了多次。如果您的步长大于 50,您将看到 non-continous 个 ID。
当您手动初始化序列时,您的步长很可能为 1。这意味着,您将看到每个 ID 被分配 50 次,并且很可能您会看到很多 duplicate-key 错误。
要么将序列中的步骤设置为 50,要么使用 @SequenceGenerator
注释并使用 allocationSize
属性来匹配 self-defined 序列的步骤。