我正在尝试在项目中添加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
答案 0 :(得分:0)
我怀疑是因为您使用@AuditMappedBy
来指向未经审核的财产。
如果您查看Child
的定义,则@AuditOverride
特别指出,对于Parent
中声明的所有属性,它们不是已审核。所以您在这里有3个选择。
将field
类中的Parent
属性定义为已审核,无论您是通过@AuditOverride
注释还是将@Audited
注释添加到Parent
类中的属性应该起作用。
在JoinedEntity
中将关联定义为未审核的关系。换句话说,这将导致对FK值进行审核,但不会对它们之间的关系进行审核。这意味着当您获取JoinedEntity
的修订版时,总是从ORM主表中加载关联。
@Audited(targetAuditMode = RelationTargetMode.NOT_AUDITED)
@AuditMappedBy(mappedBy = "field")
删除@AuditMappedBy
,因为Parent
类field
属性未经审核。