Spring JPA审计中如何保存lastModifiedBy列表

ioekq8ef  于 7个月前  发布在  Spring
关注(0)|答案(1)|浏览(101)

我正在Sping Boot Application中实现Spring JPA审计。我有下面的抽象类,它由我的实体扩展,我需要跟踪审计。

@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Auditable<T> {

    @CreatedBy
    @Column(updatable = false)
    protected T createdBy;

    @Temporal(TemporalType.TIMESTAMP)
    @CreationTimestamp
    @Column(updatable = false)
    protected Date createdDate;

    @LastModifiedBy
    protected T lastModifiedBy;

    @Temporal(TemporalType.TIMESTAMP)
    @UpdateTimestamp
    protected Date lastModifiedDate;
}

字符串
但是lastModifiedBy字段只存储了最新编辑该身份的用户的“身份”。有没有什么方法可以将其扩展为存储编辑该特定记录的用户的“列表”,并将最新编辑者附加在该列表的末尾?顺便说一下,我使用Postgres作为我的数据库。
所有可用的文档都没有这样的实现。我正在考虑构建自己的自定义审计设置。想到这里询问意见。

e0bqpujr

e0bqpujr1#

可以通过自定义audit设置来存储编辑过特定记录的用户的列表,并将最新的编辑器附加在该列表的末尾。Spring Data JPA的内置审计机制旨在捕获负责最后修改和创建实体的单个用户,这可能不直接符合你的要求。下面是一个使用Postgres作为数据库在Sping Boot 应用程序中实现这种自定义审计的高级方法:
新建一个实体来表示审计历史:

@Entity
public class AuditHistory {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    private YourEntity auditedEntity;

    @CreatedBy
    private T editor;

    @Temporal(TemporalType.TIMESTAMP)
    private Date editTimestamp;
}

字符串
修改您的Auditable类来处理审计历史列表:

@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Auditable<T> {

    @OneToMany(mappedBy = "auditedEntity", cascade = CascadeType.ALL)
    private List<AuditHistory> auditHistory = new ArrayList<>();

    // Other audit fields like createdBy, createdDate, lastModifiedBy, lastModifiedDate

    @PrePersist
    @PreUpdate
    public void updateAuditHistory() {
        // Create a new audit history entry
        AuditHistory auditEntry = new AuditHistory();
        auditEntry.setEditor(lastModifiedBy); // Set the current editor
        auditEntry.setEditTimestamp(new Date()); // Set the current timestamp
        auditEntry.setAuditedEntity(this); // Set the audited entity

        // Add the new entry to the list
        auditHistory.add(auditEntry);
    }
}


每当创建或更新实体时,updateAuditHistory方法将自动向CNOSTHistory列表添加一个条目,捕获编辑器和时间戳。
查询实体时,可以访问编辑历史记录列表,获取该实体的完整编辑历史记录。

YourEntity entity = yourEntityRepository.findById(id).orElse(null);
List<AuditHistory> auditHistory = entity.getAuditHistory();


然后,您可以浏览浏览历史记录,以获取随着时间的推移编辑该实体的用户列表。
我希望这个方法能帮助你解决这个问题。

相关问题