簡體   English   中英

Hibernate Envers L2緩存

[英]Hibernate Envers L2 caching

我找不到任何直接的解決方案,所以我還希望將來提供參考:

如何緩存對Hibernate的Envers AuditReader的調用?

我已經在整個項目中將Hazelcast配置為Hibernate的L2緩存提供程序,現在,我可以在Postgresql日志中看到大多數在數​​據庫中執行的Envers調用。

這是我的課程,為實體提供一些(對我來說)有用的修訂詳細信息:

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

通常,我為某些DTO對象調用setManipulationCtx以獲得創建和最后一次更改修訂。 創建版本不會及時更改。 當實體上有某些更改時,可以緩存和逐出上次更改緩存的修訂版。

因此,我認為我需要某種方式來手動將對象第一次放入緩存,然后在后續調用中首先查詢緩存。

我怎么做?

休眠狀態:5.2.9.Final;

Envers:5.2.12.Final;

淡褐色:3.10.1;

感謝您的提示!

不幸的是,Envers並未真正公開交互和使用2LC的方法。 但是我可以看到這是一個有用的功能。 我添加了HHH-12652作為后續操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM