Я храню в базе данных объект LOG, который неизменяем (не изменяется), но другие классы (объекты), которые он включает, могут измениться. Должен ли я аннотировать этот с помощью @Audited (я имею в виду журнал)? Это создает дополнительную таблицу истории, которая не имеет никакого смысла, потому что LOG не может измениться, поэтому он просто создает дубликаты. Но когда я не добавляю @Audited, я не могу найти его с помощью AuditReader (AuditQuery) ... Может ли кто-нибудь помочь мне здесь?
ПРИМЕР:
LOG[id, weather_station_id, measurement ...]
WEATHER_STATION[id, name ...]
SENSOR[id, name, weather_station_id ...]
Имя датчика или метеостанции может измениться, и мне нужно иметь возможность получить исходные данные при создании ЖУРНАЛА.
ОТРЕДАКТИРОВАНО: Постараюсь более подробно описать свою проблему. Я получаю некоторые измерения от датчиков метеостанции, у которой есть датчики. Мне нужно сохранить эти измерения в базе данных, чтобы иметь возможность прочитать их позже (я называю это «журналом»). Значение измерения не может измениться. Класс журнала (сущность) имеет ссылку (связь) с классом WeatherStation, который имеет ссылку на несколько датчиков. Некоторая информация о WeatherStation и датчиках может меняться с течением времени, например, версия прошивки и т. д. И мне нужно иметь возможность получить весь класс журнала из базы данных во время измерения, чтобы иметь возможность проверить номер прошивки, например, при выполнении измерения. .
Я хотел бы добиться чего-то вроде Log getLogFromDb(Long id), который вернул бы класс журнала, включая информацию о метеостанции во время измерения и информацию о датчиках во время измерения.
Я смог добиться аналогичного поведения с Hibernate Envers, когда я пометил WeatherStation, Sensor и LOG как проверенные. Но, как вы можете видеть, таблица 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()
Привет, не могли бы вы дать мне подсказку, я не уверен, как именно вы имеете в виду, что я должен использовать его. Мне нужно добиться того же поведения, что и с проверенным объектом, просто не создавать таблицу.
Я предлагаю вам просто не использовать AuditReader
, а вместо этого использовать HQL для запросов проверенных объектов. Не уверен, что у вас вообще есть проверенные объекты, но мне кажется, что у вас их нет. Пожалуйста, поделитесь более подробной информацией, такой как модель объекта или запросы, которые вы хотите сделать, если у вас все еще есть вопросы.
Хорошо, дайте мне секунду, я отредактирую исходный пост.
Это делается даже с тем, как я могу добиться этого прямо сейчас.
Я не знаю, что вы подразумеваете под "во время измерения". Насколько я понимаю, это не имеет никакого отношения к Hibernate Envers. Просто используйте HQL для объединения данных на основе внешних ключей.
Я думаю, вы правы, это можно сделать вручную, но, как видите, я могу написать это без указания запроса самостоятельно. Под «во время измерения» я подразумеваю, что мне нужно получить информацию о метеостанции и датчике, как они были в то время, когда измерение было сделано (сохранено в базе данных). Я никогда не работал с таблицами HQL и Hibernate Envers, не могли бы вы привести пример, как получить, например, какой-либо объект в определенное время с помощью HQL (или пришлите мне ссылку), спасибо.
Просто загляните в документацию: docs.jboss.org/hibernate/orm/5.4/userguide/html_single/… и, в частности, в соединения: docs.jboss.org/hibernate/orm/5.4/userguide/html_single/…
Пожалуйста, поделитесь сопоставлением объектов журнала вместе с другими.