Репозиторий ревизий данных Spring: не возвращает onetomany при использовании getRevisions - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть две сущности "Application" и "ApplicationDocument"

Таблица 1

@Entity
@Table(name = "applications")
@EntityListeners(AuditingEntityListener.class)
public class Application {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Audited
private String title;

@OneToMany(mappedBy = "application")
@JsonManagedReference
@AuditJoinTable
private List<ApplicationDocument> applicationDocuments;

}

Таблица 2

@Entity
@Table(name = "applicationDocuments")
public class ApplicationDocument {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", nullable = false)
private Long id;

@ManyToOne()
@JoinColumn(name = "applicationid")
@JsonBackReference
@Audited
private Application application;

@Audited
private String file;

}

Это создаст две таблицы аудита, и данные будут пересматриваться каждый раз после вставки, обновления и удаления. Хорошо работает до сих пор

Но для получения ревизий

У меня есть ApplicationRepository, который расширяет источники "RevisionRepository"

Поэтому, когда я получаю что-то вроде applicationRepository.getRevisions ({{myApplicationId}}). Затем, когда я смотрю на возвращенные сущности ревизий, отношение один ко многим всегда возвращается как ноль.

Я ожидаю, что он вернет список с какими-либо ApplicationDocuments, существовавшими во время этого пересмотра.

Любые идеи, что я здесь упускаю

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Проблема здесь в отображении для Application.

Хотя Envers проверяют обе сущности, поскольку они содержат хотя бы один атрибут @Audited non-id, обратная сторона коллекции в Application не проверяется. Короче говоря, Envers игнорирует атрибут, потому что @AuditJoinTable сам по себе не инициирует включение атрибута в метаданные аудита.

Вам необходимо изменить свой Application объект так, чтобы коллекция отображалась следующим образом

@OneToMany(mappedBy = "application")
@Audited
@AuditJoinTable
private List<ApplicationDocument> applicationDocuments;

Следует помнить, что если все атрибуты сущности должны проверяться Envers, вы можете вместо этого аннотировать фактический класс с помощью @Audited, чтобы минимизировать многословие, если это поможет, и вы бы избежали возникновения этой проблемы: ).

0 голосов
/ 06 ноября 2018

В данный момент я пробую входящие пружинные данные, и я полагаю, что у вас также есть эта библиотека в вашем classpath. Таким образом, вы получаете EnversRevisionRepositoryImpl под капотом, который использует API Envers AuditReader для получения информации о ревизии. Отношения в возвращенных Hibernate Proxies этим API не инициализируются, независимо от того, что указано в аннотациях JPA-отношений. Таким образом, любые OneToOne, OneToMany и т. Д. Не загружаются, даже если по умолчанию установлено значение eager или eager.

В этой проблеме есть ошибки / запросы функций, например

Стремительно загружайте коллекции, когда это указано в аннотации, определяющей отношение

Разрешить указывать выборки соединения через AuditQuery API

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