休眠 - 实体审计

问题描述:

我有一个实体,我想跟踪所有更改,因此我创建了新的实体进行审计。 下面是我的主要实体:休眠 - 实体审计

@Data 
@NoArgsConstructor 
@AllArgsConstructor 
@Entity 
@EntityListeners(AuditingEntityListener.class) 
@Table(name = "primary") 
public class PrimaryEntity { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "primary_id") 
    private Long id; 

    private String name; 

    @LazyCollection(LazyCollectionOption.FALSE) 
    @ElementCollection 
    @CollectionTable(
      name = "primary_attachments", 
      joinColumns = @JoinColumn(name = "primary_id") 
    ) 
    private List<String> attachments; 

    @CreatedDate 
    @Temporal(TemporalType.DATE) 
    private Date createDate; 

    @LastModifiedDate 
    @Temporal(TemporalType.DATE) 
    private Date lastModifiedDate; 
} 

而且下面是我对审计实体:

@Data 
@NoArgsConstructor 
@AllArgsConstructor 
@Entity 
@EntityListeners(AuditingEntityListener.class) 
@Table(name = "primary_audit") 
public class PrimaryEntityAudit { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "audit_id") 
    private Long id; 

    @NotNull 
    @Column(name = "primary_entity_id") 
    private Long primaryId; 

    private String name; 

    @LazyCollection(LazyCollectionOption.FALSE) 
    @ElementCollection 
    @CollectionTable(
      name = "primary_attachments_audit", 
      joinColumns = @JoinColumn(name = "primary_entity_id") 
    ) 
    private List<String> attachments = new ArrayList<>(); 

    @CreatedDate 
    @Temporal(TemporalType.DATE) 
    private Date createDate; 

    public PrimaryEntityAudit(PrimaryEntity primaryEntity) { 
     this.primaryId = primaryEntity.getId(); 
     this.attachments.addAll(primaryEntity.getAttachments()); 
     this.createDate = new Date(); 
    } 
} 

我创造新的PrimaryEntityAudit并保存此对象,然后更新主实体之前更新的主要实体。 操作成功并保存了对象PrimaryEntityAudit,但不保存PrimaryEntityAudit的附件。

我也尝试过在ProjectEntityAudit的构造函数中执行setAttachments,但后来我得到一个异常:HibernateExcpetion:找到对集合的共享引用。

我应该如何映射审计集合以保存PrimaryEntity附件的旧状态?

你应该看看下面的休眠模块Envers

它提供了版本控制和审计

最好是不重新发明*,除非你有技术面的制约,其阻止你使用一些框架或功能其他。