Я не могу найти никакого прямого решения для этого, поэтому я скорее прошу также для будущей ссылки:
Как кэшировать вызовы Envers AuditReader Hibernate?
Я настроил Hazelcast в качестве поставщика кэша L2 для Hibernate в своем проекте, и теперь я вижу, что в основном вызовы Envers выполняются в базе данных в журнале Postgresql.
Это мой класс, который предоставляет некоторые (для меня) полезные сведения о ревизии для сущностей:
@Service
public class RevisionProvider {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@PersistenceContext(name = Vedantas.PU_NAME, type = PersistenceContextType.TRANSACTION)
private EntityManager entityManager;
private AuditReader auditReader;
@Transactional(readOnly = true)
public OperationCtx getCreationRevisionFor(Class aClass, long id) {
auditReader = AuditReaderFactory.get(entityManager);
log.info(new LogModel("getting creation revision for entity class: {}; id: {}").toString(), aClass.getName(), id);
final Object[] array = (Object[]) auditReader.createQuery()
.forRevisionsOfEntity(aClass, false, false)
.add(AuditEntity.revisionType().eq(RevisionType.ADD))
.add(AuditEntity.id().eq(id))
.setMaxResults(1)
.getSingleResult();
return ((OperationCtx) array[1]);
}
@Transactional(readOnly = true)
public OperationCtx getLastRevisionFor(Class aClass, long id) {
log.info(new LogModel("getting last revision for entity class: {}; id: {}").toString(), aClass.getName(), id);
auditReader = AuditReaderFactory.get(entityManager);
final Object[] array = (Object[]) auditReader.createQuery()
.forRevisionsOfEntity(aClass, false, false)
.add(AuditEntity.id().eq(id))
.add(AuditEntity.revisionNumber().maximize()
.computeAggregationInInstanceContext()
)
.addOrder(AuditEntity.revisionNumber().desc())
.setMaxResults(1)
.getSingleResult();
OperationCtx lastchg = (OperationCtx) array[1];
OperationCtx creation = getCreationRevisionFor(aClass, id);
if (creation.getId() == lastchg.getId())
return new OperationCtx();
return lastchg;
}
@Transactional(readOnly = true)
public List getHistoryFor(Class aClass, String pk, String val) {
log.info(new LogModel("getting history for entity class: {}; on primaryKey: {}, with value: {}").toString(), aClass.getName(), pk, val);
auditReader = AuditReaderFactory.get(entityManager);
List res = auditReader.createQuery()
.forRevisionsOfEntity(aClass, false, false)
.add(AuditEntity.property(pk).eq(val))
.getResultList();
return res;
}
@Transactional(readOnly = true)
public void setManipulationCtx(FindDTO dto, long id) {
OperationCtx cctx = getCreationRevisionFor(DocVersion.class, id);
OperationCtx lctx = getLastRevisionFor(Metadata.class, dto.metadata.getId());
dto.createCtx = cctx;
if (Strings.isNullOrEmpty(lctx.getUserId()))
lctx = cctx;
dto.lastChangeCtx = lctx;
}
}
В основном я вызываю setManipulationCtx
для некоторого объекта DTO, чтобы получить ревизию создания и последнего изменения. Редакция создания не изменится со временем. Ревизия, сохраненная в кэше последнего изменения, может быть кэширована и удалена, когда в объекте есть какие-либо изменения.
Поэтому я думаю, что мне нужен какой-то способ вручную поместить объект в кеш в первый раз, а затем сначала запросить кеш при последующих вызовах.
Как я могу это сделать?
Спящий режим: 5.2.9.Final;
Энверс: 5.2.12.Финал;
Hazelcast: 3.10.1;
Спасибо за советы!