使用@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
相关产品推荐
相关产品推荐

