美文网首页
使用 spring boot jpa 的坑(unique 不起作

使用 spring boot jpa 的坑(unique 不起作

作者: jrw7878 | 来源:发表于2019-04-23 12:10 被阅读0次

    在使用JPA 时,定义@Entity对象时,有些字段需要唯一(如账号名),但是我发现,自动生成的数据库中,对该字段并没有设置为唯一约束

    对象如下

    @Entity
    @EntityListeners(AuditingEntityListener.class)
    @Data
    public class AdminUser {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @Column(unique = true, nullable = false)
        // @NotEmpty
        // @Length(min = 4, max = 20)
        // @ApiModelProperty("账户名(4-20)")
        private String acctName;
    
        @Column
        // 转成32位 md5密码
        private String password;
    }
    

    查看 console 输出,确实有修改命名

    Hibernate: 
        
        create table admin_user (
    ...
        ) engine=InnoDB
    Hibernate: 
    
        alter table admin_user 
           drop index UK_5gnafmd0cjdf2txrbtigl1fsa
    Hibernate: 
        
        alter table admin_user 
           add constraint UK_5gnafmd0cjdf2txrbtigl1fsa unique (acct_name)
    

    反复测试后,发现,Long对象的 unique 可以添加成功,String 对象的不行,然后我把 String 对象加上length限制

        @Column(unique = true, nullable = false, length = 20)
        private String acctName;
    

    结果就成功了。

    原因

    然后查找原因,手动创建表,添加索引,出现如下错误

    Specified key was too long; max key length is 767 bytes

    原来是因为指定字段长度过长。未指定长度的字符串,默认为255 varchar,utf8mb4字符集每个 varchar 为4bytes,即为总长255x4=1020bytes,大于了767bytes。

    因此,unique 字段的最大长度为767/4 = 191 varchar。(注:utf8mb4字符集)

    相关文章

      网友评论

          本文标题:使用 spring boot jpa 的坑(unique 不起作

          本文链接:https://www.haomeiwen.com/subject/xjuqsqtx.html