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

在使用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 不起作用))