首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate Envers审计未经审计的实体

Hibernate Envers审计未经审计的实体
EN

Stack Overflow用户
提问于 2015-09-17 10:33:25
回答 3查看 6K关注 0票数 4

我的项目中有几个类由Hibernate处理,有些由Envers审计,有些没有。现在,当我试图保存某个未经审计的实体时,我得到以下信息:

代码语言:javascript
复制
java.sql.SQLException: [SQLITE_ERROR] SQL error or missing database (no such table: audit_etc_etc)

有些人可能会认为我只是在我的数据库中没有审计表,但是Envers甚至不应该尝试查找这个表,因为实体没有被审计。我的课程是这样的:

代码语言:javascript
复制
@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-annotation标记,但它们具有对某些已审计实体的引用。然而,这些引用中的每一个都被标记为@Audited(targetAuditMode = RelationTargetAuditMode. NOT_AUDITED)-annotation。

在我的Hibernate.cfg.xml-文件中,我也没有发现任何异常,只有连接-细节、envers-选项、类映射和其他hibernate-选项。

这里出了什么问题,我怎样才能解决这个问题呢?

(注意:目前我只对类A和B进行了测试,但我假设试图保存C的实例会引发相同的异常)

更新:

当我试图保存一个B实例时,启用show_sql就显示了这一点:

代码语言:javascript
复制
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 (?, ?, ?, ?)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-21 07:59:21

问题是,您将yout属性标记为@Audited,因此envers试图将它们作为属于它的类的一部分进行审计,而类本身也是这样。您应该只使用@audit您的类声明以及您想要审计的它们中的属性来标记:

代码语言:javascript
复制
@Audited
@Entity
public class AuditedEntity{
  ...
}

而你的未审计课程

代码语言:javascript
复制
@Entity
class A {
    AuditedEntity e;
    ...
}

如果在另一个已审计实体中使用AuditedEntity:

代码语言:javascript
复制
@Entity
@Audited
public class AnotherAuditedEntity {
    @Audited
    AuditedEntity e;
    ...
}
票数 2
EN

Stack Overflow用户

发布于 2017-02-07 00:37:18

问题是您放置了@Audited注释来标记未经审核的关系。与其将该注释放在实体ABC中,不如将这些注释放在实体E中的ABC的关系中。

换言之:

代码语言:javascript
复制
@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;
}

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2015-09-18 09:41:55

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32628212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档