他のヒント

ここであなたが見ているエンティティが最新版でない場合であっても、それは使用することができますので、「現在」のリビジョン番号に以前のリビジョンの相対を見つけ、別のバージョンがあります。また、をそこにケースを扱うの改正前ではありません。 (emは、以前に取り込まEntityManagerをとする)

public static User getPreviousVersion(User user, int current_rev) {
    AuditReader reader = AuditReaderFactory.get(em);

    Number prior_revision = (Number) reader.createQuery()
    .forRevisionsOfEntity(User.class, false, true)
    .addProjection(AuditEntity.revisionNumber().max())
    .add(AuditEntity.id().eq(user.getId()))
    .add(AuditEntity.revisionNumber().lt(current_rev))
    .getSingleResult();

    if (prior_revision != null)
        return (User) reader.find(User.class, user.getId(), prior_revision);
    else
        return null
}

このはに一般化することができます:

public static T getPreviousVersion(T entity, int current_rev) {
    AuditReader reader = AuditReaderFactory.get(JPA.em());

    Number prior_revision = (Number) reader.createQuery()
    .forRevisionsOfEntity(entity.getClass(), false, true)
    .addProjection(AuditEntity.revisionNumber().max())
    .add(AuditEntity.id().eq(((Model) entity).id))
    .add(AuditEntity.revisionNumber().lt(current_rev))
    .getSingleResult();

    if (prior_revision != null)
        return (T) reader.find(entity.getClass(), ((Model) entity).id, prior_revision);
    else
        return null
}

この一般化で唯一トリッキーなビットは、エンティティのIDを取得しています。私はプレイを使用していますので!フレームワーク、私はすべてのエンティティがモデルであり、IDを取得するために((Model) entity).idを使用しますが、ご使用の環境に合わせて、これを調整する必要がありますという事実を利用することができます。

私は、このことだと思います

final AuditReader reader = AuditReaderFactory.get( entityManagerOrSession );

// This could probably be declared as Long instead of Object
final Object pk = userCurrent.getId();

final List<Number> userRevisions = reader.getRevisions( User.class, pk );

final int revisionCount = userRevision.size();

final Number previousRevision = userRevisions.get( revisionCount - 2 );

final User userPrevious = reader.find( User.class, pk, previousRevision );

のドキュメントから:

AuditReader reader = AuditReaderFactory.get(entityManager);
User user_rev1 = reader.find(User.class, user.getId(), 1);

ビルの優れたアプローチ@ブラッド-メイスして以下を変更:

  • した場合におEntityClass Idの代わりにhardcodingとを想定したモデルです。
  • なhardcodeおEntityManager.
  • この設定selectDeletedが削除されて記録ができるものではないとして返される前に改訂される。
  • 呼び出しの取得単結果に捨てると例外がない場合、結果は1以上の結果は、いずれかを呼resultlistたは例外をキャッチし、この例外(このソリューション電話getResultListとmaxResults=1)
  • の改正は、型、および企業取引(削除、見通し、利用orderByとmaxResults、およびクエリオブジェクト[3])

なのでいつものように解

public static <T> T getPreviousRevision(EntityManager entityManager, Class<T> entityClass, Object entityId, int currentRev) {
    AuditReader reader = AuditReaderFactory.get(entityManager);
    List<Object[]> priorRevisions = (List<Object[]>) reader.createQuery()
            .forRevisionsOfEntity(entityClass, false, false)
            .add(AuditEntity.id().eq(entityId))
            .add(AuditEntity.revisionNumber().lt(currentRev))
            .addOrder(AuditEntity.revisionNumber().desc())
            .setMaxResults(1)
            .getResultList();

    if (priorRevisions.size() == 0) {
        return null;
    }
    // The list contains a single Object[] with entity, revinfo, and type 
    return (T) priorRevision.get(0)[0];
}
scroll top