首页 > 解决方案 > Envers - 未找到 MappedSuperclass 属性。@AuditMappedBy 指向一个不存在的属性

问题描述

我正在尝试将环境添加到我的项目中,但是 MappedSuperclass 属性的可见性存在问题。结构是这样的:

父抽象类

@MappedSuperclass
abstract class Parent {

  @ManyToOne
  @JoinColumn(name = "joinedEntity_id")
  protected JoinedEntity field;
}

使用@Audited 注解和@AuditOverride 扩展父类的两个子类具有相同的结构:

@Audited
@AuditOverride(forClass = Parent.class, isAudited = true)
class Child extends Parent {

   Child{ super(...); }
}

加入的实体是这样的:

public class JoinedEntity {

  @Singular
  @OneToMany(mappedBy = "field", cascade = CascadeType.ALL, orphanRemoval=true)
  @LazyCollection(LazyCollectionOption.FALSE)
  @AuditMappedBy(mappedBy = "field")
  private List<Child> childs;
}

错误来自 JoinedEntity 类,即使我在子类中添加了 AuditOverride,它也无法解析指向抽象类属性的 AuditMappedBy。这是错误:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.MappingException: @AuditMappedBy points to a property that doesn't exist: $path.Child.field

标签: javaspringhibernateaudithibernate-envers

解决方案


我怀疑这是因为您使用@AuditMappedBy的是指向未经审计的财产。

如果您查看 的定义Child,则@AuditOverride明确指出对于在 中声明的所有属性Parent,它们都不会被审计。所以你在这里有3个选择。

  1. field将类中的属性定义Parent为被审计,无论您是通过@AuditOverride注释还是专门将@Audited注释添加到类中的属性Parent都应该有效。

  2. 将 中的关联定义JoinedEntity为未被审计的关系。换句话说,这会导致 FK 值被审计,但它们之间的关系没有被审计。这意味着当您获取 的修订版时JoinedEntity,总是从 ORM 主表中加载关联。

    @Audited(targetAuditMode = RelationTargetMode.NOT_AUDITED)
    @AuditMappedBy(mappedBy = "field")
    
  3. 删除,@AuditMappedBy因为Parentfield属性没有被审计。


推荐阅读