到目前为止,我发现初始化 Envers 代理的最佳解决方法是使用Dozer。将 Envers 返回的审计实体映射到自身会强制初始化。
例如:
// Assuming you have an initialized EntityManager in entityManager &
// id contains your entity id..
List<Object[]> auditList = (List<Object[]>)AuditReaderFactory.
get(entityManager).
createQuery().
forRevisionsOfEntity(Foo.class, false, true).
add(AuditEntity.id().eq(id)).
getResultList();
// Use a singleton in production apps instead...
DozerBeanMapper mapper = new DozerBeanMapper();
for(Object[] audit : auditList) {
audit[0] = mapper.map(audit[0], Foo.class);
}
// The proxies in the Foo instances in auditList are now initialized
我对这个解决方案不太满意,但我更喜欢它而不是通过手动触摸集合来初始化代理。希望有人提出更好的替代方案或 HHH-3552 得到修复!