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

Я использую Hibernate Envers для аудита своих сущностей.

У меня есть одна проверяемая сущность, Foo, которая имеет List<Bar> в качестве свойств. Однако я не хочу проверять 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 не проверяются).

Спасибо.


person Romain Linsolas    schedule 12.07.2012    source источник


Ответы (1)


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

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

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

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

person bvulaj    schedule 12.07.2012