Java 休眠环境:仅获取更改的字段
如何仅从已审核实体获取修改的字段 当我使用Java 休眠环境:仅获取更改的字段,java,hibernate,hibernate-envers,revision-history,Java,Hibernate,Hibernate Envers,Revision History,如何仅从已审核实体获取修改的字段 当我使用 AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(MyEntity.class, revisionNumber).getResultList() 我得到所有的领域;但我只想修改字段?而不使用修改标志功能 如果未在@Audited批注上使用“修改的标志”功能,则获得已审核属性从修订版X更改为修订版Y的唯一方法是实际获取两个修订,然后自己比较两个对象实例之间的实
AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(MyEntity.class, revisionNumber).getResultList()
我得到所有的领域;但我只想修改字段?而不使用修改标志功能
如果未在@Audited
批注上使用“修改的标志”功能,则获得已审核属性从修订版X更改为修订版Y的唯一方法是实际获取两个修订,然后自己比较两个对象实例之间的实际字段值
具有修改标志功能
假设您正在@Audited
注释上使用修改的标志功能,目前唯一的方法是获取给定实体实例的修订号,并使用这些修订和已审核列的先验知识,使用Envers查询API询问是否为该修订更改了属性
显然,这种方法并不理想,因为它会将一些先验知识强加给用户代码,以了解为获得所需结果而审核的字段
List<Number> revisions = reader.getRevisions( MyEntity.class, myEntityId );
for ( Number revisionNumber : revisions ) {
for ( String propertyName : propertyNamesToCheckList ) {
final Long hits = reader.createQuery()
.forRevisionsOfEntity( MyEntity.class, false, false )
.add( AuditEntity.id().eq( myEntityId ) )
.add( AuditEntity.revisionNumber().eq( revisionNumber ) )
.add( AuditEntity.propertyName( propertyName ).hasChanged() )
.addProjection( AuditEntity.id().count() )
.getSingleResult();
if ( hits == 1 ) {
// propertyName changed at revisionNumber
}
else {
// propertyName didn't change at revisionNumber
}
}
}
此功能可能会被扩展或更改,因为它将被视为实验性的,但这是用户要求的,我们至少打算基于修改的标志提供此功能的第一步
目前我们还没有决定是否或者如何支持非修改标志,所以现在唯一的选择还是蛮力bean比较
有关此功能的更多详细信息,请参见。“仅修改字段”,您需要字段的格式是什么?字符串数组?在修订编号和修订编号-1或当前之间?请更具体一点。我们支持我有实体人员id、姓名、生日,如果我修改名称,请使用所有字段创建修订版,并且我希望获得名称已从Melek更改为Melek Ellouze的示例。您想在重命名后对名称进行进一步更改吗?或者仅重命名?仅对修订版进行当前更改(仅重命名),但如果对同一修订版我更改了firstName和lastName,我希望将字段firstName从xxx更改为yyy lastName从xxx更改为YYYY,我找不到在字段发生更改时返回的方法!!我正在使用修改过的标志功能我添加了一个示例(未经测试),但它给了您一个想法。@Naros您对6.0.0何时发布有任何估计吗?@A_Di-Matteo我们现在正在完成最后一部分,以最终确定ORM的第一阶段alpha,因此我希望在未来3-6个月内的某个时候能够完成。
List results = reader.forRevisionsOfEntityWithChanges( MyEntity.class false )
.add( AuditEntity.id().eq( entityId ) )
.getResultList();
Object previousEntity = null;
for ( Object row : results ) {
Object[] rowArray = (Object[]) row;
final MyEntity entity = rowArray[0];
final RevisionType revisionType = (RevisionType) rowArray[2];
final Set<String> propertiesChanged = (Set<String>) rowArray[3];
for ( String propertyName : propertiesChanged ) {
// using the property name here you know
// 1. that the property changed in this revision (no compare needed)
// 2. Can get old/new values easily from previousEntity and entity
}
}