2

私は長い間エンバーを使用していません、そして私はどこにも答えを見つけることができないように見える問題にぶつかりました。スタックトレースをグーグルで検索しようとしましたが、役に立たなかったので、やみくもに明らかな何かが欠けているに違いありません。データベース内の以前のバージョンのDocumentクラスを取得するために、org.hibernate.envers.AuditReaderで'find(class、versionNumber)'メソッドを実行しようとすると、次のスタックトレースが取得されるようです。

java.lang.NullPointerException
org.hibernate.envers.entities.EntityInstantiator.createInstanceFromVersionsEntity(EntityInstantiator.java:91)
org.hibernate.envers.entities.EntityInstantiator.addInstancesFromVersionsEntities(EntityInstantiator.java:113)
org.hibernate.envers.query.impl.EntitiesAtRevisionQuery.list(EntitiesAtRevisionQuery.java:110)
org.hibernate.envers.query.impl.AbstractAuditQuery.getSingleResult(AbstractAuditQuery.java:108)
org.hibernate.envers.reader.AuditReaderImpl.find(AuditReaderImpl.java:119)
org.hibernate.envers.reader.AuditReaderImpl.find(AuditReaderImpl.java:94)
com.example.repository.AbstractDocumentTypeManager.getVersion(AbstractDocumentTypeManager.java:221)
com.example.repository.AbstractDocumentTypeManager.getVersion(AbstractDocumentTypeManager.java:1)
com.example.logic.versioning.BaseVersioningService.getApprovedSnapshot(BaseVersioningService.java:54)
com.example.logic.versioning.BaseVersioningService$$FastClassByCGLIB$$d33887d.invoke(<generated>)
net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
...

このエラーの原因となるコードは次のとおりです。これは私のドキュメントが保存された後に行われ、適切なバージョンがデータベース(document_AUD)に作成されているようです。

public Document getVersion(String objectId, Number version) {
    AuditReader auditReader = getAuditReader();
    /* at this point, i guarantee that neither objectId nor version are null. */
    Document revision = auditReader.find(Document.class, objectId, version);
    return revision;
}

public AuditReader getAuditReader() {
    return AuditReaderFactory.get(entityManager);
}

私の「Document」クラスには、次のように注釈が付けられています...

@Entity(name = "document")
@DiscriminatorColumn(name = "DTYPE", discriminatorType = DiscriminatorType.STRING)
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
@Cacheable(true)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "modelObjectCache")
public abstract class Document<T extends Document<?>> extends ModelObject implements Serializable, Comparable<T>,
    Versionable {
    /* many properties of a Document here. There are 2 subclasses of Document, identified by a database discriminator. */
}

この問題を適切に見つけるには、さらにコードが必要であることをお知らせください。

読んでくれてありがとう、そしてどんな提案も歓迎します、

リッチ。

4

1 に答える 1

5

了解しました。答えは見つかったようです。AuditReaderでfindメソッドを実行するときは、抽象スーパークラスではなく、実際に実装クラスを送信する必要があります。だから、例えば私が言うところ、

Document revision = auditReader.find(Document.class, objectId, version);

私は実際に置く必要があります:

Document revision = auditReader.find(DocumentImplementation.class, objectId, version);

素晴らしい。

于 2011-11-04T14:20:07.180 に答える