Hibernate Envers проверяет неаудитированные объекты

У меня есть несколько классов в моем проекте, которые обрабатываются Hibernate, некоторые проверяются Envers, некоторые нет. Теперь, когда я пытаюсь сохранить некую неаудитированную сущность, я получаю следующее:

java.sql.SQLException: [SQLITE_ERROR] SQL error or missing database (no such table: audit_etc_etc)

Некоторые, вероятно, могут подумать, что у меня просто нет таблицы аудита в моей базе данных, но Envers не должен даже пытаться искать эту таблицу, потому что сущность не проверяется. Мои классы выглядят так:

@Entity
class A {
    /* some 'normal' attributes here */

    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
    AuditedEntity e;

    List<B> listOfBs;
}

@Entity
class B {
    /* more 'normal' attributes here */

    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
    AuditedEntity e; // and some more references to audited entities

    A anA;

    List<C> listOfCs;
}

@Entity
class C {
    /* more 'normal' attributes here */

    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
    AuditedEntity e; // and some more references to audited entities

    B anB;
}

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

Я также не нашел ничего необычного в моем файле hibernate.cfg.xml, только детали подключения, параметры envers, сопоставления классов и некоторые другие параметры гибернации.

Что здесь не так и как я могу исправить эту проблему, возникающую при сохранении?

(Примечание: на данный момент я тестировал это только для классов A и B, но я предполагаю, что попытка сохранить экземпляр C вызовет то же исключение)

Обновление:
При включении show_sql отображается следующее, когда я пытаюсь сохранить экземпляр B:

Hibernate: update table_b set all_attributes=? where idB=?
Hibernate: insert into audit_description (timestamp, description) values (?, ?)
Hibernate: insert into audit_table_b (revision_type, attributes, moreAttributes, revision) values (?, ?, ?, ?)

person AidenPearce    schedule 17.09.2015    source источник


Ответы (3)


Проблема в том, что вы помечаете свои атрибуты как @Audited, поэтому envers пытаются проверять их как часть класса, которому он принадлежит, и самого класса. Вы должны только пометить @Audited объявление ваших классов и атрибуты внутри них, которые вы хотите проверить:

@Audited
@Entity
public class AuditedEntity{
  ...
}

и ваши непроверенные классы

@Entity
class A {
    AuditedEntity e;
    ...
}

Если вы используете AuditedEntity внутри другого объекта аудита:

@Entity
@Audited
public class AnotherAuditedEntity {
    @Audited
    AuditedEntity e;
    ...
}
person Ricardo Vila    schedule 21.09.2015

Проблема в том, что вы разместили аннотацию @Audited для обозначения неаудитированной связи. Вместо того, чтобы помещать эту аннотацию в ваши сущности A, B и C, вы должны размещать их внутри своей сущности E в отношениях с A, B и C.

Другими словами:

@Entity
@Audited
public class E {
  @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
  private A a;
  @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
  private B b;
  @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)     
  private C c;
}

Надеюсь, это поможет.

person Naros    schedule 07.02.2017

Оказывается, @Audited(...) заставляет Envers проверять сущности и тем самым пытаться записывать данные в несуществующие таблицы аудита. Добавление @NotAudited к каждому @Audited(..) решило проблему для меня, возможно, вам вообще не нужны обе аннотации.

person AidenPearce    schedule 18.09.2015