Envers-找不到MappedSuperclass属性。 @AuditMappedBy指向不存在的属性

时间:2018-06-26 08:24:58

标签: java spring hibernate audit hibernate-envers

我正在尝试在项目中添加envers,但是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。这是错误:

由以下原因引起:org.springframework.beans.factory.BeanCreationException:在类路径资源[org / springframework / boot / autoconfigure / orm / jpa / HibernateJpaAutoConfiguration.class]中创建名称为'entityManagerFactory'的bean时出错。方法失败;嵌套的异常是org.hibernate.MappingException:@AuditMappedBy指向一个不存在的属性:$ path.Child.field

1 个答案:

答案 0 :(得分:0)

我怀疑是因为您使用@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属性未经审核。