【问题标题】:Hibernate Envers - how to search non audited entityHibernate Envers - 如何搜索非审计实体
【发布时间】:2021-04-01 11:39:45
【问题描述】:

我存储到数据库实体 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);
}

【问题讨论】:

  • 请与其他人共享日志实体映射。

标签: java spring-boot hibernate hibernate-envers spring-data-envers


【解决方案1】:

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

来访问元模型

【讨论】:

  • 嗨,你能给我一些提示吗,我不确定你的意思是我应该使用它。我需要实现与审计实体相同的行为,只是不创建表。
  • 我建议你干脆不要使用AuditReader,而是使用 HQL 来查询被审计的实体。不确定您是否有经过审计的实体,但对我来说,您似乎没有。如果您仍有疑问,请分享更多详细信息,例如您想要执行的实体模型或查询。
  • 好的,等一下,我会编辑原帖。
  • 即使以我现在能够实现的方式完成。
  • 我不知道你所说的“测量时”是什么意思。据我了解,这与 Hibernate Envers 无关。只需使用 HQL 根据外键连接数据。
猜你喜欢
  • 2015-12-14
  • 2011-07-10
  • 2013-06-28
  • 2013-08-27
  • 2012-12-05
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 2023-03-24
相关资源
最近更新 更多