ids for this class must be manually assigned before calling save() : JPA的save()方法报错处理

1、问题描述

在使用JPA框架进行数据存储时,调用CrudRepository的save()方法报错:
org.springframework.orm.jpa.JpaSystemException: ids for this class must be manually assigned before calling save(): model对象路径;
ids for this class must be manually assigned before calling save() : JPA的save()方法报错处理
JPA给我们的解决思路:调用save()方法之前,必须手动分配此类的ID

二、源码思路

JPA的提示很明显,也就是让我们手动分配ID。这时就有个疑问:明明已经在数据库设置成主键自增了啊?
道理很简单,JPA不知道我们的主键生成策略,但JPA已经给我们了主键生成策略的注解@GeneratedValue。
ids for this class must be manually assigned before calling save() : JPA的save()方法报错处理
主键生成策略如下:
ids for this class must be manually assigned before calling save() : JPA的save()方法报错处理
这里稍作解释:
1、TABLE :指示持久性提供程序必须使用基础数据库表为实体分配主键,以确保唯一性
2、SEQUENCE :指示持久性提供程序必须使用数据库序列为实体分配主键
3、IDENTITY :指示持久性提供程序必须使用数据库标识列为实体分配主键
4、AUTO(默认) :指示持久性提供程序应为特定数据库选择适当的策略。自动生成策略可能期望数据库资源存在,或者可能试图创建数据库资源。如果供应商不支持架构生成或无法在运行时创建架构资源,则可以提供有关如何创建此类资源的文档

三、解决方案

1、如果我们在数据库设置主键自增。则需要添加注解@GeneratedValue(strategy = GenerationType.IDENTITY)。来标识使用数据库为实体分配主键。
2、如果我们使用了序列。则需要添加注解@GeneratedValue(strategy = GenerationType.SEQUENCE)。并且要通过@SequenceGenerator注解设置序列的属性来获取主键值。