Hibernate envers,删除后事件引发约束冲突异常

Hibernate envers,删除后事件引发约束冲突异常,hibernate,hibernate-envers,Hibernate,Hibernate Envers,项目使用Hibernate3.5、SpringWebFlow2和HibernateEnvers进行审计。Envers在hibernate.cfg.xml中配置。我在实体“ArticleGroup”和“Article”之间有一对多关系映射。表“articles”有一个外键“article\u group\u id”,它引用了表“article\u group”中的id。在前端,当我删除一篇文章时,Hibernate Envers会对post delete事件抛出约束冲突异常。如果我不使用Enver

项目使用Hibernate3.5、SpringWebFlow2和HibernateEnvers进行审计。Envers在hibernate.cfg.xml中配置。我在实体“ArticleGroup”和“Article”之间有一对多关系映射。表“articles”有一个外键“article\u group\u id”,它引用了表“article\u group”中的id。在前端,当我删除一篇文章时,Hibernate Envers会对post delete事件抛出约束冲突异常。如果我不使用Envers,删除操作可以正常工作。这两个实体的定义如下

    @Entity
    @Table(name="article_groups")
    @Audited
    public class ArticleGroup implements Serializable {

        @OneToMany(mappedBy="articleGroup", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
        @OrderBy("id")
        private List<Article> articles;

        // other fields, getters and setters
    }

    @Entity 
    @Table(name="articles")
    @Audited
    public class Article implements Serializable {

        @ManyToOne
        @JoinColumn(name = "article_group_id")
        private ArticleGroup articleGroup;

        // other fields, getters, setters
    }

正如您所看到的,当Envers在表'audit.articles\u AUD'中插入时,article\u group\u id为null,这导致了约束冲突。有人知道怎么修吗?非常感谢。

如果您正在进行后期删除,并且
articles\u AUD
articles
或在此操作期间删除的任何其他条目有任何限制,则您将尝试在
articles\u AUD
中添加一个引用不再存在的条目

根据经验,我们将引用排除在审核表之外,以便更好地保存修订历史。如果审核表包含对非审核表的约束,则如果删除审核表中的任何条目,修订历史记录可能会中断


参考您在设置
org.hibernate.envers.store\u data\u时使用的解决方案,请删除

当实体被删除时,实体数据是否应存储在修订中 已删除(,而不是仅将id和所有其他属性存储为 空)。这通常不需要,因为数据存在于 最后一次修订。然而,有时候,这更容易,也更容易 在上一次修订中高效地访问它(然后是 删除前包含的实体存储两次)


这告诉我,您的审核表中有
非NULL的列,因此当Envers试图插入
NULL
时,会违反约束。您可能希望在审核表中允许null。

明白了。在配置文件中设置此属性:

<prop key="org.hibernate.envers.store_data_at_delete">true</prop>
true
参考: 表3.1。Envers配置属性
org.hibernate.envers.store_data__在_delete上

我想
是否对
article\u AUD.article\u group\u id
有限制?或者它对实际的
文章
表有任何限制吗?如果您正在进行后期删除,并且
articles\u AUD
articles
有任何限制,那么您可能会尝试在
articles\u AUD
中添加一个条目,以获取不再存在的引用。您好,很抱歉,审核表名为“audit.articles\u AUD”。它对实际的articles表没有任何约束。它只有一个外键指向表“revinfo”。如果尝试从DB控制台调用:insert into audit.articles\u AUD(REVTYPE、content、language、name、order\u number、title、article\u group\u id、id、REV)值('2',NULL、NULL、NULL、NULL、NULL、'14',17'),会发生什么?你有什么错误?嗨,谢谢你的回复。审核表“articles\u AUD”对表“articles”没有任何约束。唯一的外键指向“revinfo”。另一件事是,为什么insert语句中的所有值都是NULL?我想它们应该包含已删除文章的字段值?有什么建议吗?谢谢
Hibernate: delete from live.articles where id=?
Hibernate: select nextval ('hibernate_sequence')
Hibernate: insert into audit.REVINFO (REVTSTMP, REV) values (?, ?)
Hibernate: insert into audit.articles_AUD (REVTYPE, content, language, name, order_number, title, article_group_id, id, REV) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
82828 [http-bio-8080-exec-2] DEBUG   org.springframework.orm.hibernate3.HibernateTransactionManager  - Initiating transaction rollback after commit exception
org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
...
Caused by: java.sql.BatchUpdateException: Batch entry 0 insert into audit.articles_AUD (REVTYPE, content, language, name, order_number, title, article_group_id, id, REV) values ('2', NULL, NULL, NULL, NULL, NULL, NULL, '14', '17') was aborted.  Call getNextException to see the cause.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2619)
<prop key="org.hibernate.envers.store_data_at_delete">true</prop>