nullpointerexception во время Hibernate Envers найти метод - PullRequest
2 голосов
/ 31 октября 2011

Я не использую envers очень долго, и я столкнулся с проблемой, которую я просто не могу найти ответ где-нибудь. Я попытался найти трассировку в стеке, но безрезультатно, поэтому я, должно быть, упускаю что-то ослепительно очевидное. Кажется, я получаю следующую трассировку стека всякий раз, когда пытаюсь запустить метод 'find (class, versionNumber)' в org.hibernate.envers.AuditReader для получения предыдущей версии класса Document в базе данных:

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

Пожалуйста, дайте мне знать, что вам нужно больше кода, чтобы правильно найти эту проблему.

Большое спасибо за чтение и любые предложения приветствуются,

богачей.

1 Ответ

5 голосов
/ 04 ноября 2011

Хорошо, похоже, я нашел ответ - когда вы запускаете метод find в AuditReader, вы должны фактически послать реализующий класс, а не абстрактный суперкласс. так, например, где я говорю,

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

мне на самом деле нужно поставить:

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

Marvelous.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...