Java Hibernate-实体审计

Java Hibernate-实体审计,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个实体,我想跟踪所有更改,因此我创建了新的实体进行审计。 以下是我的主要实体: @Data @NoArgsConstructor @AllArgsConstructor @Entity @EntityListeners(AuditingEntityListener.class) @Table(name = "primary") public class PrimaryEntity { @Id @GeneratedValue(strategy = GenerationTyp

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

@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;
}
@数据
@诺尔格构装师
@AllArgsConstructor
@实体
@EntityListeners(AuditingEntityListener.class)
@表(name=“primary”)
公共类主要实体{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“primary\u id”)
私人长id;
私有字符串名称;
@LazyCollection(LazyCollectionOption.FALSE)
@元素集合
@收集表(
name=“主要附件”,
joinColumns=@JoinColumn(name=“primary_id”)
)
私人名单附件;
@创建数据
@时态(TemporalType.DATE)
私人日期;
@最后修改日期
@时态(TemporalType.DATE)
私人日期最后修改日期;
}
以下是我的审计实体:

@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();
    }
}
@数据
@诺尔格构装师
@AllArgsConstructor
@实体
@EntityListeners(AuditingEntityListener.class)
@表(name=“主要审计”)
公共类PrimaryEntityAudit{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“audit\u id”)
私人长id;
@NotNull
@列(name=“primary\u entity\u id”)
私人长原生动物;
私有字符串名称;
@LazyCollection(LazyCollectionOption.FALSE)
@元素集合
@收集表(
name=“主要附件审计”,
joinColumns=@JoinColumn(name=“primary\u entity\u id”)
)
私有列表附件=新的ArrayList();
@创建数据
@时态(TemporalType.DATE)
私人日期;
公共主要实体审计(主要实体主要实体){
this.primaryId=primaryEntity.getId();
this.attachments.addAll(primaryEntity.getAttachments());
this.createDate=新日期();
}
}
在更新主实体之前,我创建新的PrimaryEntityAudit并保存此对象,然后更新主实体。 并且操作成功并保存了对象PrimaryEntityAudit,但不保存PrimaryEntityAudit中的附件

我还尝试在ProjectEntityAudit的构造函数中执行setAttachments,但随后出现了一个异常:HibernateException:找到了对集合的共享引用


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

您应该查看以下hibernate模块

它提供了版本控制和审核功能

最好不要重新发明轮子,除非您有技术限制,阻止您使用某些框架或其他框架