Hibernate Envers审核未审核的实体

时间:2015-09-17 10:33:25

标签: java hibernate 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-options,类映射和其他一些hibernate选项。

这里有什么问题,如何解决保存时出现的问题?

(注意:我现在只针对A类和B类测试过这个,但我认为尝试保存C的实例会抛出相同的异常)

更新
当我尝试保存B实例时,启用show_sql会显示此信息:

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 (?, ?, ?, ?)

3 个答案:

答案 0 :(得分:2)

问题在于您将属性标记为@Audited,因此envers尝试将它们作为其所属类的一部分进行审核,并将类自身审核。 您只应使用@Audited标记您的类声明及其中要审核的属性:

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

以及未经审核的课程

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

如果您在另一个经审核的实体中使用AuditedEntity:

@Entity
@Audited
public class AnotherAuditedEntity {
    @Audited
    AuditedEntity e;
    ...
}

答案 1 :(得分:2)

问题是您放置@Audited注释以标记未审核的关系。不要将该注释放在您的实体ABC中,而应将这些注释放在您的实体E中与A的关系,{ {1}}和B

换句话说:

C

希望有所帮助。

答案 2 :(得分:0)

事实证明,@Audited(...)会导致Envers审核实体,从而尝试写入不存在的审计表。将@NotAudited添加到每个@Audited(..)为我解决了问题,也许您根本不需要两个注释。