You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Hibernate 4迁移TableHiLoGenerator至Hibernate 5的方案咨询

Hibernate 4 → 5 保留 TableHiLoGenerator 行为的迁移方案

核心背景

Hibernate 5 中org.hibernate.id.TableHiLoGenerator并未被移除,仍可直接使用;同时官方推荐使用org.hibernate.id.enhanced.TableGenerator配合HiLo优化器,后者是后续版本的维护方向。两种方式都能完全兼容原有表结构与数据,无需修改HIBERNATE_ID_GENERATION表。


迁移方案与示例

方案1:直接沿用原有配置(快速兼容)

Hibernate 5 完全兼容 Hibernate 4 的TableHiLoGenerator配置,无需大幅修改,仅需确认依赖包包含该类(在hibernate-core中)。

原int类型ID配置直接保留:

@Id
@GenericGenerator(name="audit-prop-table-generator", strategy="org.hibernate.id.TableHiLoGenerator",
    parameters={@Parameter(value="hibernate_id_generation", name="table")})
@GeneratedValue(generator="audit-prop-table-generator")
@Column(name = "ID")
private int id;

原泛型Long类型ID配置直接保留:

@Id
@Column(name="ID")
@GenericGenerator(name="default-table-generator", strategy="org.hibernate.id.TableHiLoGenerator",
            parameters={@Parameter(value="hibernate_id_generation", name=TableHiLoGenerator.TABLE),
            @Parameter(value="5000", name=TableHiLoGenerator.MAX_LO)})  
protected Long id;

方案2:迁移到官方推荐的enhanced.TableGenerator(长期维护)

如果希望使用Hibernate 5的标准实现,可通过TableGenerator配置完全匹配原有Hi/Lo逻辑,兼容现有表数据:

对应第一个原配置(无max_lo,默认max_lo=49):

@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "audit-prop-table-generator")
@TableGenerator(
        name = "audit-prop-table-generator",
        table = "HIBERNATE_ID_GENERATION",
        pkColumnName = "GEN_NAME",
        valueColumnName = "NEXT_HI",
        pkColumnValue = "DEFAULT", // 与TableHiLoGenerator默认主键值一致
        initialValue = 0,
        allocationSize = 50 // allocationSize = max_lo + 1,对应默认max_lo=49
)
@Column(name = "ID")
private int id;

对应第二个原配置(max_lo=5000):

@Id
@Column(name="ID")
@GeneratedValue(strategy = GenerationType.TABLE, generator = "default-table-generator")
@TableGenerator(
        name = "default-table-generator",
        table = "HIBERNATE_ID_GENERATION",
        pkColumnName = "GEN_NAME",
        valueColumnName = "NEXT_HI",
        pkColumnValue = "DEFAULT",
        initialValue = 0,
        allocationSize = 5001 // 对应原max_lo=5000
)
protected Long id;

关键注意事项

  • 表结构无需修改:两种方案都适配现有HIBERNATE_ID_GENERATION表,GEN_NAME列默认值为DEFAULT,与原有逻辑一致。
  • 数据安全:所有配置都会读取现有NEXT_HI值,不会重置或篡改原有数据,保证ID生成连续性。
  • 类型匹配:确保ID字段类型(int/Long)与原有配置完全一致,避免类型转换异常。

验证步骤

  1. 将Hibernate依赖升级到5.x版本(例如hibernate-core:5.6.15.Final)
  2. 替换或保留注解配置
  3. 启动应用并执行插入操作,检查生成的ID是否符合原有Hi/Lo规则
  4. 查看HIBERNATE_ID_GENERATION表的NEXT_HI值,确认其更新逻辑与之前一致

内容的提问来源于stack exchange,提问作者e leibowitz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:28:12