关系 OneToMany 的 Envers 审计 table 外键为空

Foreign key empty on Envers audit table for relation OneToMany

我有如下关系,新修改后的审计table外键总是空的:

@ManyToOne
@Audited(targetAuditMode=RelationshipTargetAuditMode.NOT_AUDITED)
@JoinColumn(name="mail_iid")
@private Mail mail;

...

@OneToMany(cascade=Cascade.ALL, orphan = true, fetch= fetchType.LAZY)
@JoinColumn(name="mail_iid")
private List<Attachments> attachments;

插入新寄存器后,原table有iid,修改后没有

有人知道这个问题。

只有一种方法会导致这种情况发生,即没有正确管理双向关系。

我怀疑您从来没有调用 Attachments#setMail 将新创建的 Mail 实体分配给 Attachments 实体,而是简单地将 Attachments 实体添加到集合中你的 Mail 实体级联。

这种双向关系的单方面维护是错误的,会导致真正不正确的结果,特别是如果实体实例是从 1LC 检查的,并且从不从数据库中刷新;这正是您在 mail_iid 字段中看到 table 和 null 的原因。

您的代码应确保正确设置关系的双方

// setup bidirectional mappings
attachments.setMail( mail );
mail.getAttachments().add( attachments );

当您这样做时,您最终会像预期的那样在审计 table 中填充 mail_iid,并且在遍历实体的缓存实例时也避免了任何问题已加载到 1LC 中的对象图。