2016-03-24 5 views
0

私は単純な監査エンティティを持っており、エンバーを使って特定のフィールドの変更を追跡しています。Hibernate EnversでRevisionEntityからRevisionTypeを取得するには?

私は、Entity + RevisionEntityのRevisionTypeをMOD、ADDまたはDELのいずれかにする必要があります。

これを実現する方法は?

私は情報がAUDテーブルだと知っていますが、私は通常のマッピングで検索できません。

答えて

0

私は、この動作を実現するために、カスタムRevisionEntity + RevisionEntityListenerを使用して終了:

public class UsuarioRevisionListener implements RevisionListener, EntityTrackingRevisionListener { 

    @Override 
    public void newRevision(Object revisionEntity) { 
    } 

    @Override 
    public void entityChanged(Class entityClass, String entityName, Serializable entityId, RevisionType revisionType, Object revisionEntity) { 
     UsuarioRevisionEntity revision = (UsuarioRevisionEntity) revisionEntity; 
     revision.getEntityRevType().put(UsuarioRevisionEntity.chave(entityClass,entityId), revisionType); 
    } 
} 

そして、私のリビジョンエンティティ:

@Entity 
@RevisionEntity(UsuarioRevisionListener.class) 
public class UsuarioRevisionEntity extends DefaultTrackingModifiedEntitiesRevisionEntity { 

    private static final long serialVersionUID = 4211821630661371266L; 

    @ElementCollection(fetch=FetchType.EAGER) 
    @Enumerated(EnumType.STRING) 
    @Column(name="REVTYPE") 
    @MapKeyColumn(name="NAMEID") 
    @CollectionTable(name="ENT_REVTYPE", [email protected](name="REV")) 
    @Getter @Setter 
    private Map<String,RevisionType> entityRevType = new HashMap<>(); 

    public <T extends Entidade> Optional<RevisionType> getRevType(T entity) { 
     return Optional.fromNullable(entityRevType.get(chave(entity.getClass(),entity.getId()))); 
    } 

    public static String chave(Class entityClass, Serializable entityId) { 
     return String.format("%s-%s",entityClass.getSimpleName(),entityId.toString()); 
    } 
} 

このソリューションでは、基本的には、各エンティティクラス+ IDを追跡しますそのリビジョンで変更/追加/削除され、それを照会して、特定のエンティティに対してどのリビジョンタイプがそのリビジョンをマークしているかを知ることができます。

+0

RevisionListenerとEntityTrackingRevisionListenerの両方を実装する必要はありません。 EntityTrackingRevisionListenerは、RevisionListenerを継承します。 – denov

関連する問題