Hibernate 6.4.4下SQL Server的@GeneratedValue与SequenceStyleGenerator问题
你的问题核心是Hibernate的SequenceStyleGenerator与SQL Server的IDENTITY列机制冲突,具体细节如下:
ID生成机制的不匹配
你配置的SequenceStyleGenerator配合pooled-lo优化器,本质是依赖数据库序列(或模拟序列)提前批量获取ID并缓存。但SQL Server中你的表ID列是IDENTITY类型——这是一种数据库自动生成ID的自增机制,和序列是完全独立的两种实现。当插入记录时,Hibernate可能没有主动传入ID值(因为IDENTITY列由数据库自动赋值),所以插入成功,记录正常存入。但Hibernate已经从序列(或模拟序列的表)中获取了一批缓存ID,此时实体对象的ID被设置为缓存中的值,而数据库中实际存储的ID是IDENTITY生成的自增值,两者不一致。
查询时触发冲突的场景
当你查询该实体时,Hibernate会将数据库返回的实际ID与Session中缓存的实体ID做对比。为了同步状态,Hibernate可能会尝试执行一条包含缓存ID的插入/更新语句,此时就会触发SQL Server的限制:IDENTITY_INSERT为OFF时,不能显式给IDENTITY列赋值,这就是你看到的异常。GenerationType.AUTO的隐含冲突
虽然你指定了自定义的sequenceGenerator,但GenerationType.AUTO在SQL Server环境下,Hibernate的默认适配逻辑会倾向于优先使用IDENTITY机制。这种“自定义序列生成器”与“数据库IDENTITY列”的双重配置,进一步放大了ID值的不一致问题,最终在查询环节暴露错误。
而改为GenerationType.IDENTITY后,Hibernate彻底放弃序列生成逻辑,完全依赖SQL Server的IDENTITY列自动生成ID,缓存与数据库的ID值一致,自然不再报错。
内容的提问来源于stack exchange,提问作者Yusuf BESTAS

