Hibernate Envers - как искать объект без аудита

Я храню в базе данных объект 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);
}

Пожалуйста, поделитесь сопоставлением объектов журнала вместе с другими.

dassum 22.12.2020 19:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
183
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать HQL для поиска как проверенных, так и обычных сущностей. Попробуйте выполнить отладку, чтобы увидеть, как структурированы типы метамоделей для проверенных сущностей. Вы можете получить доступ к метамоделям, заглянув в EntityManagerFactory.getMetamodel().getEntities()

Привет, не могли бы вы дать мне подсказку, я не уверен, как именно вы имеете в виду, что я должен использовать его. Мне нужно добиться того же поведения, что и с проверенным объектом, просто не создавать таблицу.

Jakub Znamenáček 29.12.2020 09:20

Я предлагаю вам просто не использовать AuditReader, а вместо этого использовать HQL для запросов проверенных объектов. Не уверен, что у вас вообще есть проверенные объекты, но мне кажется, что у вас их нет. Пожалуйста, поделитесь более подробной информацией, такой как модель объекта или запросы, которые вы хотите сделать, если у вас все еще есть вопросы.

Christian Beikov 29.12.2020 10:44

Хорошо, дайте мне секунду, я отредактирую исходный пост.

Jakub Znamenáček 29.12.2020 10:53

Это делается даже с тем, как я могу добиться этого прямо сейчас.

Jakub Znamenáček 29.12.2020 12:42

Я не знаю, что вы подразумеваете под "во время измерения". Насколько я понимаю, это не имеет никакого отношения к Hibernate Envers. Просто используйте HQL для объединения данных на основе внешних ключей.

Christian Beikov 30.12.2020 02:09

Я думаю, вы правы, это можно сделать вручную, но, как видите, я могу написать это без указания запроса самостоятельно. Под «во время измерения» я подразумеваю, что мне нужно получить информацию о метеостанции и датчике, как они были в то время, когда измерение было сделано (сохранено в базе данных). Я никогда не работал с таблицами HQL и Hibernate Envers, не могли бы вы привести пример, как получить, например, какой-либо объект в определенное время с помощью HQL (или пришлите мне ссылку), спасибо.

Jakub Znamenáček 30.12.2020 13:38

Другие вопросы по теме