Java 类org.hibernate.envers.RevisionType 实例源码

项目:ARCLib    文件:HistoricStoreTest.java   
@Test
public void retrieveSingleRevisionTest() {
    VersionedEntity entity = new VersionedEntity();
    entity.setTest("test1");
    store.save(entity);

    flushCache();

    List<Revision> revisions = historicStore.getRevisions(entity.getId(), new Params());
    assertThat(revisions, hasSize(1));

    Revision revision = revisions.get(0);
    assertThat(revision.getId(), is(notNullValue()));
    assertThat(revision.getCreated(), is(notNullValue()));
    assertThat(revision.getItems(), hasSize(1));

    RevisionItem item = revision.getItems().iterator().next();
    assertThat(item.getEntityId(), is(entity.getId()));
    assertThat(item.getOperation(), is(RevisionType.ADD));

    VersionedEntity result = historicStore.findAtRevision(entity.getId(), revision.getId());
    assertThat(result.getId(), is(entity.getId()));
    assertThat(result.getTest(), is(entity.getTest()));
}
项目:VersioningWithEnvers    文件:Converters.java   
public static RevisionTypeDto convert(RevisionType source) {

        if(source == null) {
            return null;
        }

        switch (source) {
            case ADD:
                return RevisionTypeDto.ADD;
            case MOD:
                return RevisionTypeDto.MOD;
            case DEL:
                return RevisionTypeDto.DEL;
            default:
                throw new IllegalArgumentException("source");
        }
    }
项目:hibernate-envers-demo    文件:ProductDetailsDAOTest.java   
private void assertProperObjectsReturned(final Object[] revisionObject, final ProductDetailsEntity pde) {

        Assert.assertEquals(3, revisionObject.length);
        Assert.assertTrue(ProductDetailsEntity.class.isInstance(revisionObject[0]));
        Assert.assertTrue(DefaultRevisionEntity.class.isInstance(revisionObject[1]));
        Assert.assertTrue(RevisionType.class.isInstance(revisionObject[2]));

        final ProductDetailsEntity pd = (ProductDetailsEntity) revisionObject[0];
        final RevisionType rt = (RevisionType) revisionObject[2];

        Assert.assertEquals(RevisionType.ADD, rt);

        Assert.assertEquals(pde.getStoreName(), pd.getStoreName());
        Assert.assertEquals(pde.getExpirationDate(), pd.getExpirationDate());
        Assert.assertEquals(pde.getActive(), pd.getActive());
        Assert.assertEquals(pde.getWasChecked(), pd.getWasChecked());
    }
项目:ARCLib    文件:RevisionListener.java   
@Override
public void entityChanged(Class entityClass, String entityName, Serializable entityId, RevisionType revisionType, Object revisionEntity) {
    Revision revision = (Revision) revisionEntity;

    if (revision.getItems() == null) {
        revision.setItems(new HashSet<>());
    }

    revision.getItems().add(new RevisionItem((String)entityId, revisionType));
}
项目:ARCLib    文件:HistoricStoreTest.java   
@Test
public void multipleInstancesTest() {
    VersionedEntity entity1 = new VersionedEntity();
    entity1.setTest("test1");

    VersionedEntity entity2 = new VersionedEntity();
    entity2.setTest("test2");
    store.save(asSet(entity1, entity2));

    flushCache();

    List<Revision> revisions = historicStore.getRevisions(entity1.getId(), new Params());
    assertThat(revisions, hasSize(1));

    Revision revision = revisions.get(0);
    assertThat(revision.getId(), is(notNullValue()));
    assertThat(revision.getCreated(), is(notNullValue()));
    assertThat(revision.getItems(), hasSize(2));

    assertThat(revision.getItems(), hasItem(allOf(
            hasProperty("entityId", is(entity1.getId())),
            hasProperty("operation", is(RevisionType.ADD))
    )));

    assertThat(revision.getItems(), hasItem(allOf(
            hasProperty("entityId", is(entity2.getId())),
            hasProperty("operation", is(RevisionType.ADD))
    )));

    VersionedEntity result = historicStore.findAtRevision(entity1.getId(), revision.getId());
    assertThat(result.getId(), is(entity1.getId()));
    assertThat(result.getTest(), is(entity1.getTest()));

    result = historicStore.findAtRevision(entity2.getId(), revision.getId());
    assertThat(result.getId(), is(entity2.getId()));
    assertThat(result.getTest(), is(entity2.getTest()));
}
项目:pcm-api    文件:RevisionListenerImpl.java   
@Override
public void entityChanged(@SuppressWarnings("rawtypes") Class entityClass,
        String entityName, Serializable entityId,
        RevisionType revisionType, Object revisionEntity) {
    String type = entityClass.getName();
    Byte rt = revisionType.getRepresentation();
    ((RevisionInfoEntity) revisionEntity).addModifiedEntityType(type, rt,
            (RevisionInfoEntity) revisionEntity);

}
项目:HibernateDemos    文件:EnversDemo.java   
public void printRevisions(List<Object[]> revisions) {
    for (Object[] revision : revisions) {
        final Project project = (Project) revision[0];
        final DefaultRevisionEntity revisionEntity = (DefaultRevisionEntity) revision[1];
        final RevisionType revisionType = (RevisionType) revision[2];

        System.out.println();
        System.out.println(project.toString());
        System.out.println(revisionEntity.toString());
        System.out.println("REVISION TYPE: " + revisionType.name());
        System.out.println();
    }
}
项目:ds4p    文件:RevisionListenerImpl.java   
@Override
public void entityChanged(@SuppressWarnings("rawtypes") Class entityClass,
        String entityName, Serializable entityId,
        RevisionType revisionType, Object revisionEntity) {
    String type = entityClass.getName();
    Byte rt = revisionType.getRepresentation();
    ((RevisionInfoEntity) revisionEntity).addModifiedEntityType(type, rt,
            (RevisionInfoEntity) revisionEntity);

}
项目:hibernate-demos    文件:EnversDemo.java   
public void printRevisions(List<Object[]> revisions) {
    for (Object[] revision : revisions) {
        final Project project = (Project) revision[0];
        final DefaultRevisionEntity revisionEntity = (DefaultRevisionEntity) revision[1];
        final RevisionType revisionType = (RevisionType) revision[2];

        System.out.println();
        System.out.println(project.toString());
        System.out.println(revisionEntity.toString());
        System.out.println("REVISION TYPE: " + revisionType.name());
        System.out.println();
    }
}
项目:ARCLib    文件:HistoricStoreTest.java   
@Test
public void retrieveMultipleRevisionTest() {
    VersionedEntity entity = new VersionedEntity();
    entity.setTest("test1");
    store.save(entity);

    flushCache();

    entity.setTest("test2");
    store.save(entity);

    flushCache();

    Params params =  new Params();
    params.setOrder(Order.ASC);

    List<Revision> revisions = historicStore.getRevisions(entity.getId(), params);
    assertThat(revisions, hasSize(2));

    Revision revision = revisions.get(0);
    assertThat(revision.getId(), is(notNullValue()));
    assertThat(revision.getCreated(), is(notNullValue()));

    RevisionItem item = revision.getItems().iterator().next();
    assertThat(item.getEntityId(), is(entity.getId()));
    assertThat(item.getOperation(), is(RevisionType.ADD));

    VersionedEntity result = historicStore.findAtRevision(entity.getId(), revision.getId());
    assertThat(result.getId(), is(entity.getId()));
    assertThat(result.getTest(), is("test1"));

    // second revision
    revision = revisions.get(1);
    assertThat(revision.getId(), is(notNullValue()));
    assertThat(revision.getCreated(), is(notNullValue()));

    item = revision.getItems().iterator().next();
    assertThat(item.getEntityId(), is(entity.getId()));
    assertThat(item.getOperation(), is(RevisionType.MOD));

    result = historicStore.findAtRevision(entity.getId(), revision.getId());
    assertThat(result.getId(), is(entity.getId()));
    assertThat(result.getTest(), is("test2"));
}
项目:ARCLib    文件:HistoricStoreTest.java   
@Test
public void deleteTest() {
    VersionedEntity entity = new VersionedEntity();
    entity.setTest("test1");
    store.save(entity);

    flushCache();

    store.delete(entity);

    flushCache();

    Params params =  new Params();
    params.setOrder(Order.ASC);

    List<Revision> revisions = historicStore.getRevisions(entity.getId(), params);
    assertThat(revisions, hasSize(2));

    Revision revision = revisions.get(0);
    assertThat(revision.getId(), is(notNullValue()));
    assertThat(revision.getCreated(), is(notNullValue()));

    RevisionItem item = revision.getItems().iterator().next();
    assertThat(item.getEntityId(), is(entity.getId()));
    assertThat(item.getOperation(), is(RevisionType.ADD));

    VersionedEntity result = historicStore.findAtRevision(entity.getId(), revision.getId());
    assertThat(result.getId(), is(entity.getId()));
    assertThat(result.getTest(), is("test1"));

    // second revision
    revision = revisions.get(1);
    assertThat(revision.getId(), is(notNullValue()));
    assertThat(revision.getCreated(), is(notNullValue()));

    item = revision.getItems().iterator().next();
    assertThat(item.getEntityId(), is(entity.getId()));
    assertThat(item.getOperation(), is(RevisionType.DEL));

    result = historicStore.findAtRevision(entity.getId(), revision.getId());
    assertThat(result, is(nullValue()));
}
项目:ARCLib    文件:HistoricStoreTest.java   
@Test
public void multipleInstancesSeparateTest() {
    VersionedEntity entity1 = new VersionedEntity();
    entity1.setTest("test1");
    store.save(entity1);
    flushCache();

    VersionedEntity entity2 = new VersionedEntity();
    entity2.setTest("test2");
    store.save(entity2);
    flushCache();

    List<Revision> revisions = historicStore.getRevisions(entity1.getId(), new Params());
    assertThat(revisions, hasSize(1));

    Revision revision = revisions.get(0);
    assertThat(revision.getId(), is(notNullValue()));
    assertThat(revision.getCreated(), is(notNullValue()));
    assertThat(revision.getItems(), hasSize(1));

    assertThat(revision.getItems(), hasItem(allOf(
            hasProperty("entityId", is(entity1.getId())),
            hasProperty("operation", is(RevisionType.ADD))
    )));

    VersionedEntity result = historicStore.findAtRevision(entity1.getId(), revision.getId());
    assertThat(result.getId(), is(entity1.getId()));
    assertThat(result.getTest(), is(entity1.getTest()));

    result = historicStore.findAtRevision(entity2.getId(), revision.getId());
    assertThat(result, is(nullValue()));


    revisions = historicStore.getRevisions(entity2.getId(), new Params());
    assertThat(revisions, hasSize(1));

    revision = revisions.get(0);
    assertThat(revision.getId(), is(notNullValue()));
    assertThat(revision.getCreated(), is(notNullValue()));
    assertThat(revision.getItems(), hasSize(1));

    assertThat(revision.getItems(), hasItem(allOf(
            hasProperty("entityId", is(entity2.getId())),
            hasProperty("operation", is(RevisionType.ADD))
    )));

    result = historicStore.findAtRevision(entity1.getId(), revision.getId());
    assertThat(result.getId(), is(entity1.getId()));
    assertThat(result.getTest(), is(entity1.getTest()));

    result = historicStore.findAtRevision(entity2.getId(), revision.getId());
    assertThat(result.getId(), is(entity2.getId()));
    assertThat(result.getTest(), is(entity2.getTest()));
}
项目:ARCLib    文件:HistoricStoreTest.java   
@Test
public void multipleInstancesSeparateDeleteTest() {
    VersionedEntity entity1 = new VersionedEntity();
    entity1.setTest("test1");
    store.save(entity1);
    flushCache();

    VersionedEntity entity2 = new VersionedEntity();
    entity2.setTest("test2");
    store.save(entity2);
    store.delete(entity1);
    flushCache();

    Params params =  new Params();
    params.setOrder(Order.ASC);

    // first object
    List<Revision> revisions = historicStore.getRevisions(entity1.getId(), params);
    assertThat(revisions, hasSize(2));

    // first revision ADD
    Revision revision = revisions.get(0);
    assertThat(revision.getId(), is(notNullValue()));
    assertThat(revision.getCreated(), is(notNullValue()));
    assertThat(revision.getItems(), hasSize(1));

    assertThat(revision.getItems(), hasItem(allOf(
            hasProperty("entityId", is(entity1.getId())),
            hasProperty("operation", is(RevisionType.ADD))
    )));

    VersionedEntity result = historicStore.findAtRevision(entity1.getId(), revision.getId());
    assertThat(result.getId(), is(entity1.getId()));
    assertThat(result.getTest(), is(entity1.getTest()));

    // second revision DEL
    revision = revisions.get(1);
    assertThat(revision.getId(), is(notNullValue()));
    assertThat(revision.getCreated(), is(notNullValue()));
    assertThat(revision.getItems(), hasSize(2));

    assertThat(revision.getItems(), hasItem(allOf(
            hasProperty("entityId", is(entity1.getId())),
            hasProperty("operation", is(RevisionType.DEL))
    )));

    result = historicStore.findAtRevision(entity1.getId(), revision.getId());
    assertThat(result, is(nullValue()));


    // second object
    revisions = historicStore.getRevisions(entity2.getId(), params);
    assertThat(revisions, hasSize(1));

    revision = revisions.get(0);
    assertThat(revision.getId(), is(notNullValue()));
    assertThat(revision.getCreated(), is(notNullValue()));
    assertThat(revision.getItems(), hasSize(2));

    assertThat(revision.getItems(), hasItem(allOf(
            hasProperty("entityId", is(entity1.getId())),
            hasProperty("operation", is(RevisionType.DEL))
    )));

    assertThat(revision.getItems(), hasItem(allOf(
            hasProperty("entityId", is(entity2.getId())),
            hasProperty("operation", is(RevisionType.ADD))
    )));

    result = historicStore.findAtRevision(entity1.getId(), revision.getId());
    assertThat(result, is(nullValue()));

    result = historicStore.findAtRevision(entity2.getId(), revision.getId());
    assertThat(result.getId(), is(entity2.getId()));
    assertThat(result.getTest(), is(entity2.getTest()));
}
项目:ARCLib    文件:HistoricStoreTest.java   
@Test
public void singleDepTest() {
    VersionedDepEntity depEntity = new VersionedDepEntity();
    depEntity.setValue("value1");

    VersionedEntity entity = new VersionedEntity();
    entity.setTest("test1");
    entity.setDeps(asSet(depEntity));

    store.save(entity);

    flushCache();

    List<Revision> revisions = historicStore.getRevisions(entity.getId(), new Params());
    assertThat(revisions, hasSize(1));

    Revision revision = revisions.get(0);
    assertThat(revision.getId(), is(notNullValue()));
    assertThat(revision.getCreated(), is(notNullValue()));
    assertThat(revision.getItems(), hasSize(3));

    assertThat(revision.getItems(), hasItem(allOf(
            hasProperty("entityId", is(entity.getId())),
            hasProperty("operation", is(RevisionType.ADD))
    )));

    assertThat(revision.getItems(), hasItem(allOf(
            hasProperty("entityId", is(depEntity.getId())),
            hasProperty("operation", is(RevisionType.ADD))
    )));

    // @JoinColumn creates own item for the parent entity
    assertThat(revision.getItems(), hasItem(allOf(
            hasProperty("entityId", is(entity.getId())),
            hasProperty("operation", is(RevisionType.MOD))
    )));


    VersionedEntity result = historicStore.findAtRevision(entity.getId(), revision.getId());
    assertThat(result.getId(), is(entity.getId()));
    assertThat(result.getTest(), is(entity.getTest()));
    assertThat(result.getDeps(), hasItem(allOf(
            hasProperty("id", is(depEntity.getId())),
            hasProperty("value", is(depEntity.getValue()))
    )));
}
项目:VersioningWithEnvers    文件:AuditQueryResult.java   
public AuditQueryResult(T entity, CustomRevisionEntity revision, RevisionType type) {
    this.entity = entity;
    this.revision = revision;
    this.type = type;
}
项目:VersioningWithEnvers    文件:AuditQueryResult.java   
public RevisionType getType() {
    return type;
}
项目:VersioningWithEnvers    文件:CustomerHistory.java   
public CustomerHistory(Customer customer, Number revision, RevisionType revisionType) {
    this.customer = customer;
    this.revision = revision;
    this.revisionType = revisionType;
}
项目:VersioningWithEnvers    文件:CustomerHistory.java   
public RevisionType getRevisionType() {
    return revisionType;
}
项目:hibernate-envers-demo    文件:ProductDAO.java   
/**
 * Get all products that need to be shown to the checker for approval.
 * 
 * @return a list of Object[]. Each element will be an Object[3] array with
 *         the following items: Object[0] - the {@link ProductEntity} at a
 *         revision ( greater or equal than the one given as parameter)
 *         Object[1] a {@link DefaultRevisionEntity} Object[2] a
 *         {@link RevisionType} object containing information about the
 *         revision
 */
@Transactional
public List<Object[]> getAllProductsWaitingForApproval() {
    /**
     * Get all distinct {@link ProductEntity} objects where the wasChecked
     * property is false order by modified descending
     */
    final AuditQuery query = this.getAuditReader()
                                 .createQuery()
                                 .forRevisionsOfEntity(ProductEntity.class,
                                                       false,
                                                       true)
                                 .addOrder(AuditEntity.property("modified")
                                                      .desc())
                                 .add(AuditEntity.revisionNumber()
                                                 .maximize()
                                                 .computeAggregationInInstanceContext())
                                 .add(AuditEntity.property("wasChecked")
                                                 .eq(Boolean.FALSE))
                                 .add(AuditEntity.revisionType()
                                                 .ne(RevisionType.DEL));

    final List<Object[]> resultList = query.getResultList();

    final List<Object[]> result = new ArrayList<>();

    /**
     * for each "changed" object found in the db we need to check if there
     * is a newer revision of it in which the {@link ProductEntity} was
     * approved (wasChecked = true) because we do not need to retrieve
     * already checked objects to the checker.
     */
    for (final Object[] change : resultList) {
        final ProductEntity pe = (ProductEntity) change[0];
        final AuditQuery queryForWasCheckedTrue = this.getAuditReader()
                                                      .createQuery()
                                                      .forRevisionsOfEntity(ProductEntity.class,
                                                                            false,
                                                                            true)
                                                      .addOrder(AuditEntity.property("modified")
                                                                           .desc())
                                                      .add(AuditEntity.id()
                                                                      .eq(pe.getId()))
                                                      .add(AuditEntity.property("wasChecked")
                                                                      .eq(Boolean.TRUE));

        if (pe.getModified() != null) {
            queryForWasCheckedTrue.add(AuditEntity.property("modified")
                                                  .gt(pe.getModified()));
        }

        try {
            final Object[] trueWasChecked = (Object[]) queryForWasCheckedTrue.getSingleResult();
        }
        catch (final NoResultException ex) {
            // there is no newer revision where the current product has
            // wasChecked property == true
            result.add(change);
        }

    }

    return result;
}
项目:hibernate-envers-demo    文件:ProductRESTService.java   
/**
 * Retrieve the active products that need to be checked
 * 
 * @return a list of {@link ProductDTO} objects
 */
@RequestMapping(value = "/checker", method = RequestMethod.GET,
        produces = "application/json")
public List<ProductDTO> getAllActiveProductsForChecker() {

    /** Retrieve a list of products which need checker approval */
    final List<Object[]> productChanges = this.productDao.getAllProductsWaitingForApproval();

    final List<ProductDTO> results = new ArrayList<ProductDTO>();

    for (final Object[] revision : productChanges) {

        final ProductDTO dto = new ProductDTO();

        if (revision.length > 2
            && ProductEntity.class.isInstance(revision[0])) {

            /** get the current value for the {@link ProductDetailsEntity} */
            final ProductEntity currentValue = (ProductEntity) revision[0];
            if (RevisionType.class.isInstance(revision[2])) {

                // get the {@link RevisionType} of the current change
                final RevisionType rt = (RevisionType) revision[2];
                dto.setOperation(rt.name());

                // get the {@link DefaultRevisionEntity} and retrieve the
                // revision date
                final DefaultRevisionEntity revEntity = (DefaultRevisionEntity) revision[1];
                final Date revDate = revEntity.getRevisionDate();
                dto.setRevision(revDate.getTime());

                // get all product details associated with the current
                // product at the given revision
                dto.setProductDetails(this.getAllProductDetailsForProductAtRevision(currentValue.getId(),
                                                                                    revDate.getTime()));

                // if the revision type was 'MOD', search for the previous
                // value of the product to construct the product dto
                if (rt == RevisionType.MOD) {
                    final ProductEntity previousValue = this.productDao.getPreviousStateForProduct(currentValue.getId(),
                                                                                                   revEntity.getId());

                    dto.setInitial(previousValue);
                    dto.setChanges(currentValue);
                }
                else {
                    dto.setChanges(currentValue);
                }
            }
            results.add(dto);
        }
    }

    return results;
}
项目:hibernate-envers-demo    文件:ProductRESTService.java   
/**
 * Retrieve all {@link ProductDetailsDTO} related to the given product at
 * the given revision
 * 
 * @param prodId
 *            the id of the {@link ProductEntity}
 * @param revisionDateAsLong
 *            the timestamp of the revision as long
 * @return a list of {@link ProductDetailsDTO}
 */
private List<ProductDetailsDTO>
        getAllProductDetailsForProductAtRevision(final Long prodId,
                                                 final Long revisionDateAsLong) {

    /**
     * retrieve the information about related product details from the
     * {@link ProductDetailsDAO}
     */
    final List<Object[]> changes = this.productDetailsDao.getAllProductDetailsForProductAtRevision(prodId,
                                                                                                   new Date(revisionDateAsLong));

    final List<ProductDetailsDTO> results = new ArrayList<ProductDetailsDTO>();

    for (final Object[] revision : changes) {

        final ProductDetailsDTO dto = new ProductDetailsDTO();
        if (revision.length > 2
            && ProductDetailsEntity.class.isInstance(revision[0])) {

            /** get the current value for the {@link ProductDetailsEntity} */
            final ProductDetailsEntity currentValue = (ProductDetailsEntity) revision[0];
            if (currentValue != null) {
                currentValue.setFkProduct(prodId);
            }

            if (RevisionType.class.isInstance(revision[2])) {

                // get the {@link RevisionType} of the current change
                final RevisionType rt = (RevisionType) revision[2];
                dto.setOperation(rt.name());

                // if the revision type was 'MOD' get the previous value of
                // the entity to be able to construct the DTO
                if (rt == RevisionType.MOD) {
                    final DefaultRevisionEntity dre = (DefaultRevisionEntity) revision[1];
                    final ProductDetailsEntity previousValue = this.productDetailsDao.getPreviousStateForProductDetails(currentValue.getId(),
                                                                                                                        dre.getId());

                    if (previousValue != null) {
                        previousValue.setFkProduct(prodId);
                    }

                    dto.setInitial(previousValue);
                    dto.setChanges(currentValue);
                }
                else {
                    dto.setChanges(currentValue);
                }
            }
            results.add(dto);
        }
    }

    return results;
}
项目:HibernateDemos    文件:CustomRevisionEntity.java   
@Override
public void entityChanged(Class entityClass, String entityName, Serializable entityId, RevisionType revisionType,
        Object revisionEntity) {
    // do nothing -- here purely to demonstrate capabilities
}
项目:hibernate-demos    文件:CustomRevisionEntity.java   
@Override
public void entityChanged(Class entityClass, String entityName, Serializable entityId, RevisionType revisionType,
        Object revisionEntity) {
    // do nothing -- here purely to demonstrate capabilities
}
项目:apple-orm    文件:DataAccessUtility.java   
/**
 * looking for initial revision of entity(for first database insert).
 * 
 * @param auditReader
 *            envers reader implementation
 * @param persistentClass
 *            something that extends {@link AbstractPersistentEntity}
 * @param uniqueIdentifier
 *            primary key of entity
 * @return revision number
 */
public static Number initialRevision(AuditReader auditReader, Class<? extends IBO> persistentClass, long uniqueIdentifier) {
    return (Number) auditReader.createQuery()
            .forRevisionsOfEntity(persistentClass, true, true)
            .add(AuditEntity.id().eq(uniqueIdentifier))
            .add(AuditEntity.revisionType().eq(RevisionType.ADD))
            .addProjection(AuditEntity.revisionNumber().min())
            .getSingleResult();
}
项目:apple-orm    文件:DataAccessUtility.java   
/**
 * looking for latest modify revision of entity(for latest database
 * update/delete).
 * 
 * @param auditReader
 *            envers reader implementation
 * @param persistentClass
 *            something that extends {@link AbstractPersistentEntity}
 * @param uniqueIdentifier
 *            primary key of entity
 * @return revision number
 */
public static Number latestModifyRevision(AuditReader auditReader, Class<? extends IBO> persistentClass, long uniqueIdentifier) {
    return (Number) auditReader
            .createQuery()
            .forRevisionsOfEntity(persistentClass, true, true)
            .add(AuditEntity.id().eq(uniqueIdentifier))
            .add(AuditEntity.revisionType()
            .in(new RevisionType[] { RevisionType.MOD, RevisionType.DEL }))
            .addProjection(AuditEntity.revisionNumber().max())
            .getSingleResult();
}