Spring 数据修订存储库:使用 getRevisions 时不返回 onetomany

Spring data revision repository: not returning onetomany when using getRevisions

我有两个实体的 "Application" 和 "ApplicationDocument"

Table 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;

}

Table 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;

}

这样会创建两张审计表,每次insert、update、delete都会修改数据。到这里为止工作正常

但要检索修订

我有一个扩展弹簧的 ApplicationRepository "RevisionRepository"

所以当我获取类似 applicationRepository.getRevisions({{myApplicationId}}) 的内容时。然后,当我查看修订实体 returned 时,一对多关系始终 returned 为 null。

我希望它 return 一个列表,其中包含该修订期间存在的任何 ApplicationDocuments。

知道我在这里遗漏了什么吗

我现在正在试用 spring-data-envers,我假设您的类路径中也有这个库。所以你得到了引擎盖下的 EnversRevisionRepositoryImpl,它使用 Envers AuditReader API 来获取修订信息。此 API 返回的 Hibernate 代理中的关系未初始化,无论 JPA 关系注释中指定了什么。因此,即使默认设置为 eager 或 eager,也不会加载任何 OneToOne、OneToMany 等。

有 bugs/feature 个关于此问题的请求,例如

Eagerly load collections when indicated so in the annotation defining the relation

Allow specifying join fetches through the AuditQuery API

此处的问题出在 Application 的映射中。

虽然两个实体都被 Envers 审计,因为它们至少包含一个 @Audited 非 id 属性,但 Application 中集合的反面未被审计。简而言之,Envers 忽略了该属性,因为 @AuditJoinTable 本身不会触发该属性包含在审计元数据中。

您需要更改 Application 实体,以便集合映射如下

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

要记住的一个捷径是,如果一个实体的所有属性都要由 Envers 审计,您可以用 @Audited 注释实际的 class 以尽量减少冗长,如果这有帮助并且您本来也可以避免这个问题的:)。