EclipseLink中@MappedSuperclass父类的@Enumerated、@Convert注解不生效
问题根因
你配置的注解访问模式和注解放置位置不匹配:
你在BaseEntity类上标注了@Access(AccessType.PROPERTY),该配置要求EclipseLink从类的getter方法上读取JPA相关注解,但你当前把@Enumerated、@Convert、@Id、@Column所有注解都放在了类的私有字段上,框架无法读取到这些配置,所以使用了默认的持久化规则:枚举默认按序号(整数)存储、Instant类型直接走Java序列化写入数据库,进而触发你遇到的报错。
解决方案
二选一即可:
方案1:调整注解放置位置
保留@Access(AccessType.PROPERTY)配置,把所有JPA注解从字段移到对应的getter方法上,示例代码如下:
@MappedSuperclass @Access(AccessType.PROPERTY) public abstract class BaseEntity { private String id; private StatusEnum status; private Instant timestamp; @Id @Column(name = "ID", nullable = false) public String getId() { return id; } @Column(name = "STATUS", nullable = false) @Enumerated(EnumType.STRING) public StatusEnum getStatus() { return status; } @Column(name = "TIMESTAMP", nullable = false) @Convert(converter = InstantConverter.class) public Instant getTimestamp() { return timestamp; } // 其他setter方法 }
方案2:调整访问模式配置
把BaseEntity上的@Access(AccessType.PROPERTY)修改为@Access(AccessType.FIELD),如果你的项目默认访问模式就是FIELD,也可以直接删掉这行注解,原有放在字段上的注解就可以被正常识别。
修改完成后清理WildFly部署缓存,重新打包部署即可恢复正常。
内容的提问来源于stack exchange,提问作者balywin
相关产品推荐
相关产品推荐

