Кэширование Hibernate Envers L2

Я не могу найти никакого прямого решения для этого, поэтому я скорее прошу также для будущей ссылки:

Как кэшировать вызовы 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;

Спасибо за советы!


person greengold    schedule 31.05.2018    source источник


Ответы (1)


К сожалению, Envers на самом деле не раскрывает способ взаимодействия и использования 2LC; однако я мог видеть, что это полезная функция для добавления. Я добавил HHH-12652 в качестве дополнения.

person Naros    schedule 31.05.2018