使用 Hibernate Envers 进行对象历史记录,其中包含了比较旧和新对象的功能,并且可以正确处理集合的变化。
示例代码:
首先,需要在 Hibernate 中配置 Envers:
然后,创建实体类并添加 @Audited 注解:
@Entity
@Audited
public class Entity {
@Id
private Long id;
@OneToMany(mappedBy = "entity")
private List- items;
}
最后,可以使用 Envers 进行比较和查询历史记录:
AuditReader reader = AuditReaderFactory.get(entityManager);
Entity oldEntity = reader.find(Entity.class, id, oldRevision);
Entity newEntity = reader.find(Entity.class, id, newRevision);
List- oldItems = reader.createQuery()
.forRevisionsOfEntity(Item.class, false, true)
.add(AuditEntity.revisionNumber().eq(oldRevision))
.add(AuditEntity.relatedId("entity.id").eq(id))
.getResultList();
List
- newItems = reader.createQuery()
.forRevisionsOfEntity(Item.class, false, true)
.add(AuditEntity.revisionNumber().eq(newRevision))
.add(AuditEntity.relatedId("entity.id").eq(id))
.getResultList();