11

Hibernateによって(経由でEntityManager)ロードされたエンティティがあります:

User u = em.load(User.class, id)

このクラスはHibernateEnversによって監査されます。以前のバージョンのユーザーエンティティをロードするにはどうすればよいですか?

4

5 に答える 5

24

これは、「現在の」リビジョン番号に関連する以前のリビジョンを見つける別のバージョンです。そのため、見ているエンティティが最新のリビジョンでなくても使用できます。また、以前のリビジョンがない場合も処理します。(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 を取得することです。Play! を使っているからです。((Model) entity).idフレームワークでは、すべてのエンティティがモデルであり、id を取得するために使用するという事実を利用できますが、環境に合わせてこれを調整する必要があります。

于 2011-08-11T15:52:07.150 に答える
11

多分これは(AuditReaderドキュメントから)

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

List<Number> revNumbers = reader.getRevisions(User.class, user_rev1);
User user_previous = reader.find(User.class, user_rev1.getId(),
  revNumbers.get(revNumbers.size()-1));

(私はこれに非常に慣れていません。すべての構文が正しいかどうかはわかりません。おそらくsize()-1はsize()-2である必要がありますか?)

于 2009-05-18T20:27:58.177 に答える
4

私はそれがこれになると思います:

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 );
于 2009-05-20T19:48:18.983 に答える