Hibernate Envers - 如何搜索非审计实体

问题描述

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

示例:

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

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

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

我想实现类似 Log getLogFromDb(Long id)功能,它会返回日志类,包括测量时的 weatherStation 信息和测量时的传感器信息。

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

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

我现在就是这样做的:

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()

来访问元模型

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...