标签: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-annotation标记,但它们引用了一些经过审计的实体.然而,每个引用都标有@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)-annotation.
我在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 (?, ?, ?, ?)
解决方法:
问题是你将你的属性标记为@Audited,所以envers尝试将它们作为它所属的类的一部分进行审计,并将类审计为自身.
您只应使用@Audited标记您的类声明及其中要审核的属性:
@Audited
@Entity
public class AuditedEntity{
...
}
和你未经审计的课程
@Entity
class A {
AuditedEntity e;
...
}
如果您在另一个经审计的实体中使用AuditedEntity:
@Entity
@Audited
public class AnotherAuditedEntity {
@Audited
AuditedEntity e;
...
}
标签:java,hibernate,hibernate-envers 来源: https://codeday.me/bug/20190623/1272333.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。