关于JPA 主键,自定义生成遇到的问题,愚蠢的笔记mysql
第一次 报错: ids for this class must be manually assigned before calling save()spring
在报这个问题的时候,必定去代码中去查看本身代码set设ID的逻辑,ID的值没有被设置sql
下面是我写的代码,能够看出,在上面setId,但是下面BeanUtils工具引用dto对象将master原值给覆盖了数据库
PS: 如下面说明->org.springframework.beans.BeanUtils工具能够将dto对象对应master对象的字段替换,免去了一堆无聊的setteroracle
Master master = new Master(); Master.setId(id); Master.setAmount(amount); BeanUtils.copyProperties(dto, master); //此处是错误的,会覆盖前面的值 repository.save(master);
补充学习, 关于Spring Data JPA提供主键生成,@GeneratorValue 4种策略以及支持的数据库ide
GenerationType.TABLE ---mysql, oracle, postgresql, kingbase
GenerationType.AUTO ---mysql, oracle, postgresql, kingbase
GenerationType.IDENTITY ---mysql, postgresql, kingbase
GenerationType.SEQUENCE ---oracle, postgresql, kingbase工具
自定义生成主键,也有策略生成器,@GenericGenerator注解,该注解要配合@GeneratorValue一块儿使用post
@GeneratedValue注解中的generator属性和@GenericGenerator注解中name属性保持一致,strategy属性表示hibernate的主键生成策略学习
jar : org.hibernate:hibernate-core:5.2.16.Final的DefaultIdentifierGeneratorFactory类中的14种方式ui
public DefaultIdentifierGeneratorFactory() { this.register("uuid2", UUIDGenerator.class); this.register("guid", GUIDGenerator.class); this.register("uuid", UUIDHexGenerator.class); this.register("uuid.hex", UUIDHexGenerator.class); this.register("assigned", Assigned.class); this.register("identity", IdentityGenerator.class); this.register("select", SelectGenerator.class); this.register("sequence", SequenceStyleGenerator.class); this.register("seqhilo", SequenceHiLoGenerator.class); this.register("increment", IncrementGenerator.class); this.register("foreign", ForeignGenerator.class); this.register("sequence-identity", SequenceIdentityGenerator.class); this.register("enhanced-sequence", SequenceStyleGenerator.class); this.register("enhanced-table", TableGenerator.class); }
注意: 使用的时候必须使用他给的字符串,好比uuid,必须是小写,UUID大写是无效的
示例: ↓↓↓
@Id @GeneratedValue(generator = "orderId") @GenericGenerator(name = "orderId",strategy = "uuid") private String orderId;
----------------------------------------------