Spring Data JPA中数据库自动生成UUID主键的报错解决
解决方案
报错原因是Hibernate未识别到主键ID会由数据库自动生成,因此强制要求手动赋值。要让数据库生成UUID主键,需修改实体类的ID字段注解,明确告知Hibernate主键生成策略。
修改实体类ID字段配置
在@Id注解下方添加@GeneratedValue(strategy = GenerationType.IDENTITY),让Hibernate知道该ID由数据库负责生成:
@Entity @Table(name = "product_keys") public class ProductKeys{ @Id @Column(name = "ID", nullable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) private UUID id; // 其他字段、构造方法及getter/setter }
如果需要在实体类中同步数据库列的默认值定义,可补充columnDefinition参数(可选,因为你已通过SQL完成建表):
@Id @Column(name = "ID", nullable = false, columnDefinition = "uuid DEFAULT gen_random_uuid()") @GeneratedValue(strategy = GenerationType.IDENTITY) private UUID id;
原理说明
添加@GeneratedValue(strategy = GenerationType.IDENTITY)后,Hibernate会在执行插入操作时,不再要求提前设置ID值,而是依赖数据库的DEFAULT gen_random_uuid()生成UUID,插入完成后还会将数据库生成的ID自动回填到实体对象的id字段中。
此时再调用productKeysRepository.saveAndFlush(productKeys)即可正常插入记录,不会再抛出IdentifierGenerationException异常。
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

