Hibernate Envers - 如何搜索未经审计的实体

Hibernate Envers - how to search non audited entity

我存储到数据库实体 LOG 这是 immutable (不变)但其他 classes(实体)它包含的可以更改我是否必须用 @Audited 注释这个(我的意思是日志)?这会创建额外的 table 历史记录,这没有任何意义,因为 LOG 无法更改,因此它只是在创建重复项。但是当我不添加 @Audited 时,我无法使用 AuditReader (AuditQuery) 搜索它......有人可以帮我吗?

示例:

LOG[id, weather_station_id, measurement ...]
WEATHER_STATION[id, name ...]
SENSOR[id, name, weather_station_id ...]

传感器或气象站的名称可以更改,我需要能够在创建日志时获取原始数据。

已编辑: 我将尝试更详细地描述我的问题。我从气象站的传感器那里得到一些测量值,那里有一些传感器。我需要将这些测量值存储到数据库中,以便以后能够读取它们(我称之为“日志”)。测量值不能改变。日志 class(实体)与 weatherStation class 有引用(关系),后者引用了多个传感器。有关 weatherStation 和传感器的一些信息可能会随时间变化,例如固件版本等。我需要能够在测量时从数据库中获取整个日志 class,以便能够在测量时检查固件编号例如制作。

我想实现类似 Log getLogFromDb(Long id) 的功能,这将 return 日志 class 包括测量时的 weatherStation 信息以及测量时有关传感器的信息。

当我将 WeatherStation、Sensor 和 LOG 标记为已审核时,我能够获得与 Hibernate Envers 类似的行为。但是正如您所见,LOG table 根本没有改变,因此拥有日志历史记录 table 没有任何意义,因为它始终包含相同的数据。

我希望我的问题现在更清楚了。

我现在就是这样做的:

public Optional<Log> findVersionById(Integer id) {
    AuditReader auditReader = AuditReaderFactory.get(entityManager);
    AuditQuery query = auditReader.createQuery().forRevisionsOfEntity(Log.class, true, false);
    query.add(AuditEntity.revisionType().eq(RevisionType.ADD));
    query.add(AuditEntity.id().eq(id));
    Log log = (Log)query.getSingleResult();

    return Optional.of(log);
}

您可以使用 HQL 来搜索经过审计的实体和普通实体。尝试调试以查看已审计实体的元模型类型是如何构建的。您可以通过查看 EntityManagerFactory.getMetamodel().getEntities()

来访问元模型