我有两个实体的“应用程序”和“ 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。
任何想法,我在这里想念什么
答案 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
答案 1 :(得分:0)
这里的问题出在Application
的映射中。
由于两个实体都包含至少一个@Audited
非id属性,因此Envers正在对其进行审核,而Application
中集合的反面则未被审核。简而言之,Envers会忽略该属性,因为@AuditJoinTable
本身不会触发该属性包含在审核元数据中。
您需要更改您的Application
实体,以便按以下方式映射集合
@OneToMany(mappedBy = "application")
@Audited
@AuditJoinTable
private List<ApplicationDocument> applicationDocuments;
一个要记住的捷径是,如果实体的所有属性都将由Envers审核,则可以改用@Audited
注释实际的类,以最大程度地减少冗长,如果这样做有帮助,则可以避免出现此问题也是:)。