首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate支持L2缓存

Hibernate支持L2缓存
EN

Stack Overflow用户
提问于 2018-05-31 16:50:24
回答 1查看 214关注 0票数 0

我找不到任何直截了当的解决方案,所以我还是想问一下未来的参考:

如何缓存对Hibernate的Envers AuditReader的调用?

我已经在我的项目中将Hazelcast配置为Hibernate的L2缓存提供者,现在,我可以在Postgresql中看到大多数Envers调用正在数据库上执行。

这是我的类,它为实体提供了一些(对我来说)有用的修订细节:

代码语言:javascript
复制
@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来获取创建和最后的修改版本。创建版本不会及时更改。当实体上有一些更改时,可以缓存并逐出上次更改缓存的修订版。

因此,我认为我需要一些方法来手动将对象放入缓存中,然后在后续调用时首先查询缓存。

我该怎么做?

Hibernate: 5.2.9;

Envers: 5.2.12.Final;

Hazelcast: 3.10.1;

谢谢你的提示!

EN

回答 1

Stack Overflow用户

发布于 2018-05-31 22:34:19

不幸的是,Envers并没有真正公开一种交互和使用2LC的方式;但是我可以看到这是一个需要添加的有用特性。我已经添加了HHH-12652作为后续内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50620259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档