Hibernate JPA使用@GeneratedValue生成主键puid始终为0如何解决
问题修复方案
以下是经过验证的几个可行解决路径,按优先级依次排查即可:
- 修改字段类型为包装类
Long
你当前使用的是基本数据类型long,其默认值为0。JPA实现(如Hibernate)默认会通过判断主键是否为null来决定是否触发自动生成逻辑,基本类型永远不会为null,会直接将默认值0作为主键插入,不会触发数据库自增逻辑。修改后的代码如下:@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long puid; - 确认数据库表主键字段配置了自增属性
GenerationType.IDENTITY策略完全依赖数据库层面的自增能力,需要你检查对应表的puid字段是否开启了自增配置:- MySQL环境需给字段添加
AUTO_INCREMENT属性 - PostgreSQL、SQL Server环境需给字段添加
IDENTITY属性
若建表时未配置该属性,即使注解配置正确,数据库也不会自动生成主键值。
- MySQL环境需给字段添加
- 适配数据库类型调整主键生成策略
若你使用的是12c之前版本的Oracle,本身不支持IDENTITY类型,需换用SEQUENCE策略并配套配置序列生成器,示例如下:@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "puid_seq") @SequenceGenerator(name = "puid_seq", sequenceName = "PUID_SEQUENCE", allocationSize = 1) private Long puid; - 检查业务代码是否提前赋值
排查实体持久化之前的业务逻辑,是否存在手动给puid赋值为0的操作,手动赋值的优先级高于自动生成逻辑,会覆盖注解配置的生成规则。
内容的提问来源于stack exchange,提问作者user15980267
相关产品推荐
相关产品推荐

