2017-06-19 170 views
1

我有一個實體,我想跟蹤所有更改,因此我創建了新的實體進行審計。 下面是我的主要實體:休眠 - 實體審計

@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附件的舊狀態?

回答

3

你應該看看下面的休眠模塊Envers

它提供了版本控制和審計

最好是不重新發明輪子,除非你有技術面的制約,其阻止你使用一些框架或功能其他。