關於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;
----------------------------------------------