我们有一个具有以下属性的实体定义:
@Generated(GenerationTime.INSERT)
@Column(insertable = false, updatable = false)
private Integer number;
实体用@Audited进行注释。
最近我们从 Spring Boot 3.2(随 Hibernate 6.1.3 一起提供)升级,审计表不再包含此属性的值,而只是 NULL。
我追踪到 Envers 没有审核标记为 insertable = false 的属性。一旦设置为 true,它就开始工作。
这是预期行为还是错误? insertable 属性适用于主表,其设置是为了避免编码错误 - 数字字段只能通过序列设置。但对于审计表来说,它应该存在。
这曾经适用于 Spring Boot 2.7 和 Hibernate 5.6。在 Spring Boot 3.2 和 Hibernate 6.3.1 中停止工作。
编辑 - 我可以确认它停止与 Hibernate 6 和 Spring boot 3.1 一起工作 - 它不是 3.2 附带的东西。
我遇到了同样的问题,并通过在关系的背面添加@AuditMappedBy注释来解决它
(来自 https://docs.jboss.org/envers/docs/) 一种特殊情况是一侧使用 @OneToMany+@JoinColumn 映射的关系,而多侧使用 @ManyToOne+@JoinColumn(insertable=false, updatable=false) 映射的关系。这种关系实际上是双向的,但拥有方是集合(另请参见此处)。 要正确审核与 Envers 的此类关系,您可以使用 @AuditMappedBy 注释。它使您能够指定反向属性(使用mappedBy 元素)。对于索引集合,索引列还必须映射到引用的实体中(使用 @Column(insertable=false, updatable=false),并使用positionMappedBy 指定。此注释只会影响 Envers 的工作方式。请注意,注释是实验性的,将来可能会发生变化。