AuditQuery 如何加入实体
AuditQuery how to join entites
我有 2 个实体:
@Entity
@Getter
@Setter
@SequenceGenerator(name = "SEQ_STORE", sequenceName = "TABLE_A_SEQ", allocationSize = 1)
@Audited
@AuditTable("TABLE_A_ARCH")
@Table(name = "TABLE_A")
public class TableAEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_STORE")
protected Long id;
..some fields
@AuditJoinTable(name = "TABLE_B_ARCH")
@OneToMany(cascade = CascadeType.ALL, mappedBy = "tableA", orphanRemoval = true)
@NotEmpty
private Set<TableBEntity> dataB = Sets.newHashSet();
}
@Entity
@Getter
@Setter
@SequenceGenerator(name = "SEQ_STORE", sequenceName = "TABLE_B_SEQ", allocationSize = 1)
@Audited
@AuditTable("TABLE_B_ARCH")
@Table(name = "TABLE_B")
public class TableBEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_STORE")
protected Long id;
..some fields
@ManyToOne
@JoinColumn(name = "table_a_id", nullable = false)
private TableAEntity tableA;
}
当我对此实体执行操作时,所有关于它的信息都会进入存档表。我想 select 所有历史更改甚至来自相关实体 TableBEntity
AuditReader auditReader = AuditReaderFactory.get(getEntityManager());
AuditQuery auditQuery = auditReader.createQuery()
.forRevisionsOfEntity(TableAEntity.class, false, true)
.traverseRelation("dataB", JoinType.INNER, "data_b")
.addOrder(AuditEntity.revisionNumber().desc());
我什至尝试了不同的连接类型,但仍然出现错误:
org.hibernate.envers.exception.AuditException: This type of relation (..package..TableAEntity.dataB) isn't supported and can't be used in queries.
当我删除 .traverseRelation("dataB", JoinType.INNER, "data_b") 时,我只从 TableAEntity 获得更改,而从 TableBEntity 更改是忽略。
那是因为在 Envers 中关系遍历的初始通道仅针对 对一 关联映射;因此,为什么您会收到该错误。
计划在 Hibernate Envers 6.0 中引入对对多 关联的支持,请参阅HHH-11735。
我有 2 个实体:
@Entity
@Getter
@Setter
@SequenceGenerator(name = "SEQ_STORE", sequenceName = "TABLE_A_SEQ", allocationSize = 1)
@Audited
@AuditTable("TABLE_A_ARCH")
@Table(name = "TABLE_A")
public class TableAEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_STORE")
protected Long id;
..some fields
@AuditJoinTable(name = "TABLE_B_ARCH")
@OneToMany(cascade = CascadeType.ALL, mappedBy = "tableA", orphanRemoval = true)
@NotEmpty
private Set<TableBEntity> dataB = Sets.newHashSet();
}
@Entity
@Getter
@Setter
@SequenceGenerator(name = "SEQ_STORE", sequenceName = "TABLE_B_SEQ", allocationSize = 1)
@Audited
@AuditTable("TABLE_B_ARCH")
@Table(name = "TABLE_B")
public class TableBEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_STORE")
protected Long id;
..some fields
@ManyToOne
@JoinColumn(name = "table_a_id", nullable = false)
private TableAEntity tableA;
}
当我对此实体执行操作时,所有关于它的信息都会进入存档表。我想 select 所有历史更改甚至来自相关实体 TableBEntity
AuditReader auditReader = AuditReaderFactory.get(getEntityManager());
AuditQuery auditQuery = auditReader.createQuery()
.forRevisionsOfEntity(TableAEntity.class, false, true)
.traverseRelation("dataB", JoinType.INNER, "data_b")
.addOrder(AuditEntity.revisionNumber().desc());
我什至尝试了不同的连接类型,但仍然出现错误:
org.hibernate.envers.exception.AuditException: This type of relation (..package..TableAEntity.dataB) isn't supported and can't be used in queries.
当我删除 .traverseRelation("dataB", JoinType.INNER, "data_b") 时,我只从 TableAEntity 获得更改,而从 TableBEntity 更改是忽略。
那是因为在 Envers 中关系遍历的初始通道仅针对 对一 关联映射;因此,为什么您会收到该错误。
计划在 Hibernate Envers 6.0 中引入对对多 关联的支持,请参阅HHH-11735。