Java Hibernate Envers审核未审核的实体
我的项目中有几个类是由Hibernate处理的,有些是由Envers审计的,有些不是。现在,当我试图保存某个未经审计的实体时,我得到以下结果:Java Hibernate Envers审核未审核的实体,java,hibernate,hibernate-envers,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 {
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(…)
导致enver审计实体,从而尝试写入不存在的审计表。将@NotAudited
添加到每个@Audited(..)
解决了我的问题,也许您根本不需要这两个注释。问题是您将yout属性标记为@Audited,以便enver尝试将它们作为它所属的类的一部分进行审核,并将其作为类本身的一部分进行审核。
您应该仅使用@Audited标记您的类声明以及其中要审核的属性:
@Audited
@Entity
public class AuditedEntity{
...
}
还有你的非审计类
@Entity
class A {
AuditedEntity e;
...
}
如果在另一个受审核实体中使用AuditedEntity:
@Entity
@Audited
public class AnotherAuditedEntity {
@Audited
AuditedEntity e;
...
}
问题在于放置
@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;
}
希望有帮助
@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;
}