【发布时间】:2020-07-17 13:13:11
【问题描述】:
我们从 Hibernate 4 迁移到 5,一个主要问题是新的生成器,它为表行生成 ID。我们的旧生成器都是基于表的,比如
@TableGenerator(name = TABLE_NAME + "_generator", table = ...)
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
来自 Hibernate 5 的新默认生成器不正确地尊重这一点,并看似“从头开始”生成新 ID,因此在插入新行时会出现“已存在 ID”异常。
我找到的所有干净的解决方案都是基于 Hibernate 4 之前在 AUTO 模式下使用的想法 (@GeneratedValue(strategy = GenerationType.AUTO)),但我们始终使用 GenerationType.TABLE。
“脏”解决方案:将<property name="hibernate.id.new_generator_mappings" value="false"/> 添加到 Hibernates persistence.xml。
结果:我们现有的数据库可以毫无问题地使用,除了:来自 Hibernate 的持续警告
HHH90000015: Found use of deprecated [org.hibernate.id.MultipleHiLoPerTableGenerator] table-based id generator; use org.hibernate.id.enhanced.TableGenerator instead. See Hibernate Domain Model Mapping Guide for details.]]
我的问题是:我们如何才能保留原始数据库,停止使用已弃用的代码,并正确创建具有新 ID 的新行,而不与现有 ID 冲突?
特别是因为据说 Hibernates 5 池标识符生成器比表更好: https://vladmihalcea.com/hibernate-hidden-gem-the-pooled-lo-optimizer/
【问题讨论】: