Именованный запрос к абстрактному объекту

#entity #abstract #named

#сущность #аннотация #именованный

Вопрос:

У меня есть 3 объекта в иерархии:

Request.java

 @Entity
@Table(name="Request")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="REQUEST_TYPE", discriminatorType=DiscriminatorType.INTEGER)
@NamedQuery(name="getRequestsById", query="select r from Request r where r.id=:id and r.status=100")
public abstract class Request implemenst Serializable {
...
}
  

MedicineRequest.java

 @Entity
@Table(name="MED_REQUEST")
public abstract class MedicineRequest extends Request {
...
}
  

ExtendedMedicineRequest.java

 @Entity
@Table(name="EXT_MED_REQUEST")
@DiscriminatorValue("1")
public class ExtendedMedicineRequest extends MedicineRequest {
...
}
  

Когда я пытаюсь выполнить приведенный выше запрос, getRequestsById я получаю следующее сообщение об ошибке:

Не удается создать экземпляр абстрактного класса типа «Request» с идентификатором объекта «Request-RequestPK@c49aa166»; это может указывать на то, что дискриминатор наследования для класса настроен неправильно.

Все сущности правильно определены в persistance.xml имя столбца дискриминатора тоже правильное. В чем может быть дело??

Ответ №1:

Нет, для сущности нормально быть абстрактной.
Но я нашел причину. Запрос является универсальным, поэтому он запрашивает создание экземпляров дочерних элементов этой сущности. Один из сыновей имеет отношение к другой сущности, которая использует enum из утилиты jar. Но … проект jpa имеет этот jar в пути сборки, в то время как проект EAR не включает этот jar в список модулей, так что, наконец, jar не был в пути к классам во время выполнения. Сообщение об ошибке в этом случае обычно не имело значения.

Ответ №2:

Причина в том, что «Не удается создать экземпляр абстрактного класса типа», ваш класс запроса является абстрактным. Почему? Это сущность, тогда она НЕ ДОЛЖНА быть абстрактной.

Комментарии:

1. Нет, для сущности нормально быть абстрактной.