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

Spring Boot枚举默认构造方法异常:添加构造仍报错该如何解决?

解决Hibernate枚举映射的默认构造方法异常

你遇到的问题根源其实不是枚举缺少构造方法,而是错误地在枚举字段上使用了@Embedded注解!

为什么会报错?

@Embedded注解是用来嵌入带@Embeddable标记的自定义实体类的,比如一个包含多个字段的地址类。当你把它用在枚举字段上时,Hibernate会错误地把PromoUsage当成需要实例化的实体类,而枚举本身并不是Hibernate实体,所以它会去找实体类要求的默认构造方法,自然就抛出了找不到构造的异常——哪怕你给枚举加了构造方法,这个误解也不会消除。

正确的解决步骤

  1. 恢复你的枚举定义:枚举根本不需要显式添加构造方法,Java枚举的构造默认是私有的,Hibernate完全可以正常处理它:
public enum PromoUsage { ONLINE, OFFLINE, ONLINE_AND_OFFLINE; }
  1. 移除实体类字段上的@Embedded注解:只保留枚举映射需要的注解即可:
@Column(name="promoUsage", nullable=false)
@NotNull
@Enumerated(EnumType.STRING)
private PromoUsage promoUsage;

这样修改后,Hibernate就会正确识别这是一个枚举类型,通过@Enumerated(EnumType.STRING)把它映射为数据库中的字符串类型,不会再去寻找实体构造方法了。

额外说明

如果你的场景确实需要嵌入某个类(不是枚举),那对应的类必须添加@Embeddable注解,并且提供默认构造方法——但枚举的映射完全不需要这套逻辑,@Enumerated就足够处理枚举与数据库字段的转换了。

内容的提问来源于stack exchange,提问作者Eddy Freeman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:43:01