我正在使用带有 envers 和审计的 spring boot 3。 审核对于创建和编辑实体效果很好,但是对于删除实体,我收到以下错误:
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed:
org.springframework.dao.DataIntegrityViolationException: could not execute statement
[ERROR: null value in column "created_by" of relation "price_item_aud" violates not-null constraint
Detail: Failing row contains (356, 2, 8ca32c7d-d087-49b9-be0a-1158bb105ff9, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null).] [insert into public.price_item_aud (revend,revend_tstmp,revtype,created_by,created_date,modified_by,modified_date,...,rev,id) values (?,?,?,?,?,...,?,?)]; SQL [insert into public.price_item_aud (revend,revend_tstmp,revtype,created_by,created_date,modified_by,modified_date,...,rev,id) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)]; constraint [created_by" of relation "price_item_aud]] with root cause
org.postgresql.util.PSQLException: ERROR: null value in column "created_by" of relation "price_item_aud" violates not-null constraint
创建或编辑同一实体时,
created_by
和所有其他字段均已正确填充,但 delete
上未填充。此外,删除时不会调用 AuditorAware。
我使用以下特殊配置:
audit_strategy: "org.hibernate.envers.strategy.ValidityAuditStrategy"
audit_strategy_validity_store_revend_timestamp: true
我尝试使用多种删除方法,但似乎都没有触发JPA审核。
在添加 JPA 审计之前删除也工作得很好,所以我认为这不是由于 Evers 设置造成的。由于 JPA 审计适用于创建和修改,并且
created_by
已正确填写在实体表和 _aud 表中,因此我会询问在哪里查看的任何进一步想法。
我发现here添加
spring:
jpa:
properties:
org:
hibernate:
envers:
store_data_at_delete: true
解决问题。
或者,我可以删除 JPA 审核字段的
NotNull
约束,但我认为这个解决方案在我的情况下更好,因为删除不是一个频繁的操作。