You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot枚举映射数据库字段为Integer的问题排查与解决

问题原因

JPA默认会把枚举类型映射为数据库的整数类型,因为它默认使用枚举的ordinal()值(也就是枚举常量的索引,从0开始)来存储,所以你的role_name字段被创建为Integer类型。这就导致插入字符串枚举值时出现类型不匹配的错误。

解决方案:将字段设置为枚举字符串类型

在实体类的roleName字段上添加@Enumerated(EnumType.STRING)注解,明确指定JPA使用枚举的名称(字符串形式)来映射数据库字段。修改后的实体类代码如下:

@Entity
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Role implements GrantedAuthority {
    @Id
    @GeneratedValue
    private Integer id;

    @Column()
    @Enumerated(EnumType.STRING) // 新增该注解指定枚举存储方式
    private RoleName roleName;

    @Override
    public String getAuthority() {
        return roleName.name();
    }
}

后续操作注意事项

  • 更新数据库表结构:
    • 若使用自动建表(比如Spring Boot中spring.jpa.hibernate.ddl-auto设为update),重启应用后Hibernate会自动把role_name字段类型改为字符串类型(如VARCHAR)。
    • 若手动维护表结构,需执行SQL修改字段类型(以MySQL为例):
      ALTER TABLE role MODIFY COLUMN role_name VARCHAR(255);
      
  • 插入数据:
    表结构修改完成后,你原本的INSERT语句即可正常执行:
    insert into role(id, role_name)
    values(1, 'ROLE_USER'),
          (2, 'ROLE_ADMIN'),
          (3, 'ROLE_DIRECTOR');
    

内容的提问来源于stack exchange,提问作者Dadaboy Masharipov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:50:30