我的项目中有几个类由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-annotation标记,但它们具有对某些已审计实体的引用。然而,这些引用中的每一个都被标记为@Audited(targetAuditMode = RelationTargetAuditMode. NOT_AUDITED)-annotation。
在我的Hibernate.cfg.xml-文件中,我也没有发现任何异常,只有连接-细节、envers-选项、类映射和其他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 (?, ?, ?, ?)发布于 2015-09-21 07:59:21
问题是,您将yout属性标记为@Audited,因此envers试图将它们作为属于它的类的一部分进行审计,而类本身也是这样。您应该只使用@audit您的类声明以及您想要审计的它们中的属性来标记:
@Audited
@Entity
public class AuditedEntity{
...
}而你的未审计课程
@Entity
class A {
AuditedEntity e;
...
}如果在另一个已审计实体中使用AuditedEntity:
@Entity
@Audited
public class AnotherAuditedEntity {
@Audited
AuditedEntity e;
...
}发布于 2017-02-07 00:37:18
问题是您放置了@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;
}希望这能有所帮助。
发布于 2015-09-18 09:41:55
事实证明,@Audited(...)会导致Envers对实体进行审计,从而试图写入不存在的审计表。将@NotAudited添加到每个@Audited(..)为我解决了这个问题,也许您根本不需要这两个注释。
https://stackoverflow.com/questions/32628212
复制相似问题