Подтвердить что ты не робот

Как не проверять таблицу соединений и связанные объекты, используя Hibernate Envers?

Я использую Hibernate Envers для проверки моих объектов.

У меня есть один проверенный объект, Foo, который имеет свойства List<Bar> as. Однако я не хочу проверять сущности Bar. Таким образом, я написал, что:

@Entity
@Audited
public class Foo {

    @JoinTable(name = "T_FOO_BAR", joinColumns = @JoinColumn(name = "FOO_ID"), inverseJoinColumns = @JoinColumn(name = "BAR_ID"))
    @ManyToMany(cascade = PERSIST)
    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
    public List<Bar> getBars() {
        return bars;
    }

}

Теперь я хочу получить версию Foo:

    AuditReader reader = AuditReaderFactory.get(getEntityManager());
    Foo revision = (Foo) reader.createQuery().forEntitiesAtRevision(Foo.class, 42).getSingleResult();

К сожалению, когда я хочу получить все данные (т.е. когда он ленивы загружает bars), я получаю ошибку ORA-00942: table or view does not exist, поскольку он пытался запросить:

select ... from T_FOO_BAR_AUD x, T_BAR y where ...

Хотя, используя @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED), Hibernate Envers сохранит ссылки с элементами Bar текущего объекта.

Итак, как я могу решить свою проблему, не имея необходимости явно проверять таблицы T_BAR и T_FOO_BAR (таблица соединений)? В других словах, когда я извлекаю список bars из моего объекта ревизии, я получаю список bars от моего текущего объекта (поскольку ссылки между Foo и Bar не проверяются).

Спасибо.

4b9b3361

Ответ 1

Похоже, вы используете @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED), когда вы должны использовать @NotAudited в своем случае.

RelationTargetAuditMode.NOT_AUDITED просто не проверит объект целевой. Он все равно попытается проверить свойство List<Bar> Foo и, следовательно, таблицу соединений.

Из документов:

Если вы хотите провести аудит отношения, где целевой объект не (например, со словарными объектами, которые не меняются и не подлежат аудиту), просто комментируйте это с @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED). Затем, читая исторические версии вашей сущности, отношение будет всегда указывать на "текущую" связанную сущность.