gpt4 book ai didi

java - Hibernate Envers L2 缓存

转载 作者:行者123 更新时间:2023-12-02 11:11:02 27 4
gpt4 key购买 nike

我找不到任何直接的解决方案,所以我宁愿要求将来的引用:

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

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

这是我的类(class),为实体提供了一些(对我而言)有用的修订详细信息:

@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 对象的创建和最后更改修订版本。创建修订不会及时更改。当实体发生某些更改时,可以缓存并逐出上次更改缓存的修订版本。

所以我认为我需要某种方法来手动将对象第一次放入缓存中,然后在后续调用时首先查询缓存。

我该怎么做?

hibernate :5.2.9.最终版;

恩弗斯:5.2.12.最终;

Hazelcast:3.10.1;

感谢您的提示!

最佳答案

不幸的是,Envers 并没有真正公开交互和使用 2LC 的方法;不过我认为这是一个值得添加的有用功能。我添加了HHH-12652作为后续。

关于java - Hibernate Envers L2 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50620259/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com