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

时间:2018-11-06 11:01:08

标签: hibernate spring-boot hibernate-envers

我有两个实体的“应用程序”和“ ApplicationDocument”

表1

    private void OnLobbyCreated(LobbyCreated_t response)
    {
        print("Lobby created: " + response.m_ulSteamIDLobby);
        Lobby = new Lobby(response.m_ulSteamIDLobby);
    }

表2

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

}

这将创建两个审计表,并且在每次插入,更新和删除之后都会对数据进行修订。到这里都可以正常工作

但是要检索修订版本

我有一个ApplicationRepository,它扩展了弹簧“ RevisionRepository”

因此,当我获取诸如applicationRepository.getRevisions({{myApplicationId}})之类的内容时。然后,当我查看返回的修订版实体时,一对多关系始终返回为null。

我希望它返回一个列表,列出在该修订时间内存在的所有ApplicationDocuments。

任何想法,我在这里想念什么

2 个答案:

答案 0 :(得分:0)

我现在正在尝试使用spring-data-envers,并且我假设您的类路径上也有这个库。因此,您将获得EnversRevisionRepositoryImpl,它使用Envers AuditReader API来获取修订信息。无论JPA关系注释中指定了什么,都不会初始化通过此API返回的Hibernate Proxies中的关系。因此,即使默认情况下设置为渴望或渴望,也不会加载任何OneToOne,OneToMany等。

存在有关此问题的错误/功能请求,例如

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

Allow specifying join fetches through the AuditQuery API

答案 1 :(得分:0)

这里的问题出在Application的映射中。

由于两个实体都包含至少一个@Audited非id属性,因此Envers正在对其进行审核,而Application中集合的反面则未被审核。简而言之,Envers会忽略该属性,因为@AuditJoinTable本身不会触发该属性包含在审核元数据中。

您需要更改您的Application实体,以便按以下方式映射集合

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

一个要记住的捷径是,如果实体的所有属性都将由Envers审核,则可以改用@Audited注释实际的类,以最大程度地减少冗长,如果这样做有帮助,则可以避免出现此问题也是:)。