@evrikom

JPA 2 EclipseLink и наследование. Возникает Exception при заполнении entity запросом из БД. Как исправить?

День добрый.
В БД есть таблица, допустим, doc. Таблица содержит столбец dtype(дискриминатор по умолчанию)
Создано несколько entities
1 родительская с наследованием в одну таблицу(упрощенный вариант)
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(discriminatorType=DiscriminatorType.INTEGER)
public class Doc 
...

и несколько дочерних. В зависимости от типа дочернего документа, устанавливается свойство родительского класса
@Entity
@DiscriminatorValue("4")
public class DocReceipt extends Doc {
    public DocReceipt() {
        setDocType(DocType.DF_RECEIPT);
    }

Логи glassfish(приложение по выгрузке данных через soap) после запроса данных:
Exception Description: Missing class indicator field from database row [ArrayRecord(
	doc.ID => 71
	doc.DTYPE => null
	doc.docdate => 2017-11-17
	doc.docstate => DS_NEW
	doc.doctype => DF_RECEIPT
..
].
Descriptor: RelationalDescriptor(ru.mobilcard.office.entities.eod.EodDoc --> [DatabaseTable(docflow.eod)])
	at org.eclipse.persistence.exceptions.DescriptorException.missingClassIndicatorField(DescriptorException.java:948)
	at org.eclipse.persistence.descriptors.InheritancePolicy.classFromRow(InheritancePolicy.java:349)
	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:723)
	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.buildObject(ObjectBuilder.java:689)
	at org.eclipse.persistence.queries.ObjectLevelReadQuery.buildObject(ObjectLevelReadQuery.java:805)
	at org.eclipse.persistence.queries.ReadAllQuery.registerResultInUnitOfWork(ReadAllQuery.java:962)
	at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:573)
	at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1175)
	at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:904)
	at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1134)
	at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:460)
	at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1222)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2896)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1857)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1839)
	at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1804)
	at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:258)
	at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:473)

Есть предположение что проблема в том, что EclipseLink не может определить какую дочернюю таблицу следует использовать, но на это же есть дискриминатор. Только недавно начал изучать Java, нет ещё опыта. Документацию по JPA в java ee просмотрел, все вроде правильно, решения в интернете не нашел. Сталкивался ли кто с подобной проблемой? Как решали?
  • Вопрос задан
  • 178 просмотров
Решения вопроса 1
@evrikom Автор вопроса
Вопрос снимаю, данные в таблицу были внесены вручную, не через JPA, столбец dtype оказался незаполненным.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы