2011-10-31 3 views
2

私は非常に長い時間エンバーを使用していませんでしたが、問題はありませんでした。私はスタックトレースをグーグルで試してみましたが、役に立たないので、私は盲目的に何かを見逃しているに違いありません。 データベースのDocumentクラスの以前のバージョンを取得するために、org.hibernate.envers.AuditReaderで 'find(class、versionNumber)'メソッドを実行しようとするたびに、次のスタックトレースを取得するようです:Hibernate Enversの間にnullpointerexceptionが見つかりました

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); 
} 

私の「文書」クラスが

@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. */ 
} 

私はあなたが適切にこの問題を見つけるために任意のより多くのコードが必要です教えてください...そうのような注釈が付けられています。

多くの読書のためのおかげで、あらゆる提案を歓迎し、

豊富。

答えて

5

申し訳ありませんが、私は答えを見つけたようです - AuditReaderでfindメソッドを実行すると、実際に抽象スーパークラスではなく実装クラスを送信する必要があります。 ので、たとえば、私が言うところ、

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

は、私が実際に配置する必要があります。

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

マーベラス。