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

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

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

对象如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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 输出,确实有修改命名

1
2
3
4
5
6
7
8
9
10
11
12
13
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限制

1
2
@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字符集)