Envers - атрибут MappedSuperclass не найден.@AuditMappedBy указывает на свойство, которое не существует - PullRequest
0 голосов
/ 26 июня 2018

Я пытаюсь добавить 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 невозможно получить разрешение AuditMappedBy, которое указывает на атрибут абстрактного класса, даже если ядобавьте AuditOverride в дочерний класс.Вот ошибка:

Причина: org.springframework.beans.factory.BeanCreationException: Ошибка создания компонента с именем entityManagerFactory, определенным в ресурсе пути к классу [org / springframework / boot / autoconfigure / orm / jpa /HibernateJpaAutoConfiguration.class]: сбой вызова метода init;вложенным исключением является org.hibernate.MappingException: @AuditMappedBy указывает на несуществующее свойство: $ path.Child.field

1 Ответ

0 голосов
/ 26 июня 2018

Я подозреваю, что это потому, что вы используете @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, поскольку Parent class field свойство не проверено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...