zoukankan      html  css  js  c++  java
  • assigned before calling save & JPA id生成策略

    关于JPA 主键,自定义生成遇到的问题,愚蠢的笔记

    第一次 报错: ids for this class must be manually assigned before calling save()

    在报这个问题的时候,一定去代码中去查看自己代码set设ID的逻辑,ID的值没有被设置

    下面是我写的代码,可以看出,在上面setId,可是下面BeanUtils工具引用dto对象将master原值给覆盖了

    PS:  以下面说明->org.springframework.beans.BeanUtils工具可以将dto对象对应master对象的字段替换,免去了一堆无聊的setter

    Master master = new Master();
    Master.setId(id);
    Master.setAmount(amount);
    BeanUtils.copyProperties(dto, master); //此处是错误的,会覆盖前面的值
    repository.save(master);

    补充学习, 关于Spring Data JPA提供主键生成,@GeneratorValue 4种策略以及支持的数据库

    GenerationType.TABLE            ---mysql, oracle, postgresql, kingbase
    GenerationType.AUTO             ---mysql, oracle, postgresql, kingbase
    GenerationType.IDENTITY        ---mysql, postgresql, kingbase
    GenerationType.SEQUENCE     ---oracle, postgresql, kingbase

    自定义生成主键,也有策略生成器,@GenericGenerator注解,该注解要配合@GeneratorValue一起使用

    @GeneratedValue注解中的generator属性和@GenericGenerator注解中name属性保持一致,strategy属性表示hibernate的主键生成策略

    jar : org.hibernate:hibernate-core:5.2.16.Final的DefaultIdentifierGeneratorFactory类中的14种方式

    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;

    ----------------------------------------------

  • 相关阅读:
    IDEA @override处标红
    IntelliJ IDEA 出现" java: 程序包javax.servlet不存在、 java: 程序包javax.servlet.annotation"等错误
    IDEA中提示配置jdk1.8
    bootstrap datetimepicker 添加清空按钮
    JS中常用的Math方法
    JS数组常用方法总结
    JS字符串常用方法总结
    阻止a链接跳转方法总结
    node常见操作命令
    RAC升级后,一个节点无法连接数据库,报ORA-12537: TNS:connection closed
  • 原文地址:https://www.cnblogs.com/jpfss/p/11190187.html
Copyright © 2011-2022 走看看