#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. Нет, для сущности нормально быть абстрактной.