假设我们有一个实体:

@Entity
@Audited(withModifiedFlag = true)
public class MyEntity  {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(nullable = false, length = 50)
    private String Name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parentEntityId")
    private MyEntity parentEntity;
}

我尝试使envers在代表关系的实体字段上返回实体修订信息。 我使用addProjection创建自己的数据表示形式。 问题在于,每次与addProjection使用时,代表关系的字段名称都会出现错误(如果使用常规列,则不会有错误)。

我建立一个审核查询:

AuditQuery auditQuery = reader.createQuery()
    .forRevisionsOfEntity(MyEntity.class, false, true);

    auditQuery.addProjection(AuditEntity.revisionNumber());
    auditQuery.addProjection(AuditEntity.revisionType());        
    auditQuery.addProjection(AuditEntity.revisionProperty("timestamp"));
    auditQuery.addProjection(AuditEntity.id());
    auditQuery.addProjection(new AuditProperty<>(
                        new EntityPropertyName("parentEntity")));
    auditQuery.addProjection(new AuditProperty<>(
        new ModifiedFlagPropertyName(
            new EntityPropertyName("parentEntity"))));

错误是:

org.hibernate.QueryException: could not resolve property: parentEntity of: edu.sample.domain.entity.MyEntity_AUD

我还尝试过: new EntityPropertyName("parentEntityId") -结果是:

org.hibernate.QueryException: could not resolve property: parentEntityId of: edu.sample.domain.entity.MyEntity_AUD

编辑 :我错过了审核查询中的一条语句。 投影不仅应包含parentEntity字段值,还应包含修改后的标志: auditQuery.addProjection(new AuditProperty<>( new EntityPropertyName("parentEntity")));

如果需要修改,我需要该字段的值和信息。 这就是为什么我使用withModifiedFlag = true

问题是MyEntity_AUD表(自动生成)的架构包含字段parentEntityId 修改后的标志字段名称为parentEntity_MOD 在将投影添加到查询后,该错误就会显现:

  • addProjection(new AuditProperty<>( new EntityPropertyName("parentEntity")));

要么

  • addProjection(new AuditProperty<>( new EntityPropertyName("parentEntityId")));

修改标志正确返回,没有错误。 以及普通字段的值。

===============>>#1 票数:1

如果您确实要在此处使用投影,则可以使用selectEntity选项进行。 您在这里寻找的语法如下:

AuditQuery query = reader.createQuery()
  .forRevisionsOfEntity( MyEntity.class, false, true );

query.addProjection( AuditEntity.revisionNumber() );
query.addProjection( AuditEntity.revisionType() );
query.addProjection( AuditEntity.revisionProperty( "timestamp" ) );
query.addProjection( AuditEntity.selectEntity( false ) );

您现在应该能够使用返回的对象数组中的特定条目来访问该修订版中的任何关联或属性。 但是请注意,这与使用以下语法没有太大区别:

List results = reader.createQuery()
  .forRevisionsOfEntity( MyEntity.class, false, true )
  .getResultList();

for ( Object row : results ) {
  final Object[] array = (Object[]) row;
  final MyEntity entity = (MyEntity) array[0];
  final Object revisionEntity = array[1];
  final RevisionType revisionType = (RevisionType) array[2];
}

唯一需要注意的是, revisionEntity可以是Envers公开的任何数量的实现,也可以是您自己的自定义实现,具体取决于您配置环境的方式。 您必须检查一下正在使用的内容并进行相应的投射。

两者都是同义词,并且产生相同的结果。

唯一的实际区别是,前者将实体作为Map<String,Object>返回,而后者则返回实际的水合实体实例。

  ask by piradian translate from so

未解决问题?本站智能推荐: