升级Hibernate至6.2+版本后遇版本值未初始化错误求助
Hibernate 6.2+升级后出现"Detached entity with generated id '1' has an uninitialized version value 'null'"错误
问题描述
将项目Hibernate版本升级至6.2.0.Final、6.3.0.Final、6.4.0.Final或6.4.3.Final时,触发错误:
Detached entity with generated id '1' has an uninitialized version value 'null'. com.VERSION
使用6.1.7.Final版本时无此问题。
项目pom.xml依赖配置
<dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>10.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>jakarta.faces</artifactId> <version>4.0.5</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>6.4.3.Final</version> <optional>true</optional> </dependency>
排查与解决方案
1. 修复实体类版本字段初始化
Hibernate 6.2+对乐观锁版本字段的检查逻辑更严格,要求版本字段不能为null。在带@Version注解的实体字段上直接设置默认值:
@Version private Integer version = 0; // 对应类型设合适初始值,比如Long类型设为0L
确保实体无论是从数据库加载还是手动创建,版本字段都不会处于未初始化状态。
2. 修正实体分离后的操作逻辑
如果是在实体脱离持久化上下文(比如调用session.detach()或Session关闭后)执行更新操作,要确保分离前版本字段已经被完整加载。避免手动设置实体id后,直接将其当作已持久化实体操作却忽略版本字段的初始化。
3. 临时兼容配置(不推荐长期使用)
若需要快速验证问题来源,可以添加Hibernate配置参数放宽版本字段检查:
hibernate.jpa.compliance.version.nullable = true
此配置允许版本字段为null,但仅作为临时排查手段,最终还是建议从实体层面修复初始化问题。
4. 检查依赖冲突
确认项目中是否存在其他与JPA/Hibernate相关的依赖(比如第三方扩展、ORM工具),尝试移除非必要依赖,排查是否存在版本兼容性冲突。
内容的提问来源于stack exchange,提问作者Ömer Faruk Kurt
相关产品推荐
相关产品推荐

