【问题标题】:Envers - MappedSuperclass attribute not found. @AuditMappedBy points to a property that doesn't existEnvers - 未找到 MappedSuperclass 属性。 @AuditMappedBy 指向一个不存在的属性
【发布时间】:2018-12-04 21:37:32
【问题描述】:

我正在尝试将环境添加到我的项目中,但 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 类,它无法解析指向抽象类属性的 AuditMappedBy,即使我在子类中添加了 AuditOverride。这是错误:

原因:org.springframework.beans.factory.BeanCreationException:在类路径资源 [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class] 中定义名称为“entityManagerFactory”的 bean 创建错误:调用 init方法失败;嵌套异常是 org.hibernate.MappingException:@AuditMappedBy 指向一个不存在的属性:$path.Child.field

【问题讨论】:

    标签: java spring hibernate audit hibernate-envers


    【解决方案1】:

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

    如果您查看您对Child 的定义,@AuditOverride 明确指出对于在Parent 中声明的所有属性,它们审核。所以这里有 3 个选项。

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多