gpt4 book ai didi

java - 如何使用 spring data envers 查找实体的所有修订?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:26 25 4
gpt4 key购买 nike

我在我的 spring boot 应用程序中使用 spring-data-envers。我可以成功地记录对我的实体的审计。

现在,我需要在 UI 中向用户显示审核数据。就像会有一个搜索表单,用户可以在其中选择他想要查看审计日志的持续时间和实体。

string-data-envers提供的RevisionRepository只有以下三个方法。

@NoRepositoryBean
public interface RevisionRepository<T, ID extends Serializable, N extends Number & Comparable<N>> {

/**
* Returns the revision of the entity it was last changed in.
*
* @param id must not be {@literal null}.
* @return
*/
Revision<N, T> findLastChangeRevision(ID id);

/**
* Returns all {@link Revisions} of an entity with the given id.
*
* @param id must not be {@literal null}.
* @return
*/
Revisions<N, T> findRevisions(ID id);

/**
* Returns a {@link Page} of revisions for the entity with the given id.
*
* @param id must not be {@literal null}.
* @param pageable
* @return
*/
Page<Revision<N, T>> findRevisions(ID id, Pageable pageable);
}

如何编写自定义查询以获取特定用户在两个日期之间对实体的所有修订。

请注意,我在存储用户 ID 和修改日期的 user_rev_entity 表中添加了额外的列。如果我将此表与 entity_aud 表连接起来,我可以获得结果。

下面是我的审计表的脚本。

CREATE TABLE `user_rev_entity` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`timestamp` bigint(20) NOT NULL,
`created_by` bigint(20) NOT NULL,
`created_date` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

CREATE TABLE `revchanges` (
`rev` int(11) NOT NULL,
`entityname` varchar(255) DEFAULT NULL,
KEY `FK_et6b2lrkqkab5mhvxkv861n8h` (`rev`),
CONSTRAINT `FK_et6b2lrkqkab5mhvxkv861n8h` FOREIGN KEY (`rev`) REFERENCES `user_rev_entity` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

CREATE TABLE `roles_aud` (
`role_id` bigint(20) NOT NULL,
`rev` int(11) NOT NULL,
`revtype` tinyint(4) DEFAULT NULL,
`description` varchar(255) DEFAULT NULL,
`description_mod` bit(1) DEFAULT NULL,
`display_name` varchar(255) DEFAULT NULL,
`display_name_mod` bit(1) DEFAULT NULL,
`is_enabled` bit(1) DEFAULT NULL,
`enabled_mod` bit(1) DEFAULT NULL,
`title` varchar(255) DEFAULT NULL,
`title_mod` bit(1) DEFAULT NULL,
PRIMARY KEY (`role_id`,`rev`),
KEY `FK_pkqm51vsc35w2axvnns4bpas9` (`rev`),
CONSTRAINT `FK_pkqm51vsc35w2axvnns4bpas9` FOREIGN KEY (`rev`) REFERENCES `user_rev_entity` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

所以,基本上我是在寻找特定用户在特定时间对实体(例如角色)所做的所有更改。

将会有更多这样的实体。

最佳答案

你看过AuditReaderFactory了吗?和 AuditReader?

查看 AuditReader 的 createQuery 文档:

A query creator, associated with this AuditReader instance, with which queries can be created and later executed.

这会返回一个 AuditQueryCreator,您可以使用它来创建如下查询:

AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true);

forRevisionsOfEntity 有几个选项,请参阅 AuditQueryCreator文档。

查询应允许您使用 AuditCriterion 选择特定修订版

Hibernate envers 与此相关的文档: http://docs.jboss.org/hibernate/orm/5.0/userGuide/en-US/html_single/#revisions-of-entity

You can add constraints to this query in the same way as to the previous one. There are some additional possibilities:

  1. using AuditEntity.revisionNumber() you can specify constraints, projections and order on the revision number, in which the audited entity was modified
  2. similarly, using AuditEntity.revisionProperty(propertyName) you can specify constraints, projections and order on a property of the revision entity, corresponding to the revision in which the audited entity was modified
  3. AuditEntity.revisionType() gives you access as above to the type of the revision (ADD, MOD, DEL).

编辑我尝试了一个实际的解决方案。我几乎没有 envers 和 hibernate 标准经验,所以这可能不正确,但也许它会帮助您入门。

AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true);

query.add(AuditEntity.revisionProperty("createdDate").gt(minDate))
.add(AuditEntity.revisionProperty("createdDate").lt(maxDate))
.add(AuditEntity.revisionProperty("createdBy").eq(userId));

//the documentation shows getSingleResult returns a number
//so i'm guessing a resultList also contains numbers
List<Number> resultList = query.getResultList();

关于java - 如何使用 spring data envers 查找实体的所有修订?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36008394/

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