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

使用@MappedSuperclass与@Audited时功能正常却报错的技术问题

Hibernate Envers审计标注子类继承抽象主键父类时的错误问题

我发现多个实体类都重复使用相同的Long类型主键代码,示例如下:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

//...

public Long getId() {
    return id;
}

public void setId(Long id) {
    this.id = id;
}

为遵循DRY(Don't Repeat Yourself,不要重复造轮子)原则,我将这段代码封装为通用抽象父类,供所有子类继承使用:

@MappedSuperclass
public abstract class LongIdEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    public LongIdEntity() {}

    public LongIdEntity(Long id) { 
        this.id = id;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

但当子类标注@org.hibernate.envers.Audited并继承该抽象父类时,Hibernate抛出以下错误:

ERROR 63328 --- [persistence] [           main] o.h.metamodel.internal.MetadataContext   : HHH015007: Illegal argument on static metamodel field injection : org.hibernate.envers.DefaultRevisionEntity_#class_; expected type :  org.hibernate.metamodel.model.domain.internal.EntityTypeImpl; encountered type : jakarta.persistence.metamodel.MappedSuperclassType

需要说明的是,尽管出现该错误,Hibernate仍能正常构建表结构(子类拥有独立的审计id列,代码冗余也大幅减少)。我尝试了以下几种解决方案:

  • 同时给父类和子类标注@Audited,仍抛出相同错误;
  • 仅给子类标注@Audited,这是我当前使用的配置,功能正常但仍存在报错;
  • 仅给父类标注@Audited,无审计效果(符合预期,因为父类无对应表),且错误消失,这与错误提示的“期望实体类型却得到映射超类类型”矛盾。

我可以接受当前状态,但担心该错误会导致后续出现意外问题或bug。

内容的提问来源于stack exchange,提问作者Tom M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:25:13