【问题标题】:Hibernate Envers cannot delete entityHibernate Envers 无法删除实体
【发布时间】:2020-01-26 16:27:54
【问题描述】:

我现在真的有一个奇怪的问题。

我只想删除一个实体。

我也在使用 Hibernate 环境进行审计。所以现在我想删除这个实体。

现在我收到以下消息。

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: “成功”列不能为空

因此,当我突然从表中删除 @Audit 时,我能够删除该实体。

现在我转到我的 entity_aud 表并取消选择 NOT NULL 以表示属性成功。然后我又把@Audit放在我的桌子上方。

现在它起作用了。那么为什么如果我只想删除一个实体,在使用 Hibernate Envers 时会出现 NOT NULL 错误。

这是什么原因。

【问题讨论】:

    标签: jpa hibernate-envers


    【解决方案1】:

    删除实体后,Envers 还将为该操作生成审核条目。默认情况下,在生成删除审计记录时不会捕获实体数据,因此本质上 Envers 会尝试在审计表中插入一行,其中包含 主键修订号修订类型。所有其他列都将插入空值。

    由于您的审计表将成功列指定为NOT NULL,因此删除会引发异常。

    除了审计表中的主键、修订和修订类型列之外,所有其他列都应该在没有NOT NULL 规范的情况下创建,这意味着它们可以为NULL。如果您可以重现不符合此规则的 Envers 生成表,请通过将实体模型附加到问题中来将其报告为错误。

    配置设置org.hibernate.envers.store_data_at_delete 当设置为true 时,将告诉 Envers 不仅捕获实体的主键、修订和修订类型,而且还捕获所有已审计的列。默认情况下不启用此功能,因为一般来说,先前的版本保持相同的状态,因此复制它确实是不必要的;但是,有些用户更喜欢拥有它。

    【讨论】:

    • 您写道“除了审计表中的主键、修订和修订类型列之外,所有其他列都应使用 NOT NULL 规范创建,因此。”您真的是指“使用 NOT NULL 规范”吗?我认为它应该是“没有 NOT NULL 规范”或只是“可空的”。 -> 为此提交了一个编辑请求。
    猜你喜欢
    • 2021-04-06
    • 2017-10-22
    • 1970-01-01
    • 2020-03-09
    • 2012-12-23
    • 2011-07-10
    • 2015-12-14
    • 2015-11-04
    • 1970-01-01
    相关资源
    最近更新 更多