Как запросить базовый класс в JPA с помощью стратегии JOINED - PullRequest
1 голос
/ 31 мая 2019

У меня есть иерархия классов, сопоставленная с базой данных с использованием стратегии JOINED.Я установил значения дискриминатора на подклассы.Когда я сохраняю сущность, правильно соединенные таблицы заполняются, и мой столбец дискриминатора содержит правильный дискриминатор для класса, сохраненного в этой строке.

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

<openjpa-2.4.2-r422266:1777108 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: Could not map discriminator value "LabEngagement" to any known subclasses of the requested class "com.cerner.chronicle.fable.models.stories.Story" (known discriminator values: [Story]).

Список известных значений дискриминатора не содержит значений дискриминатора, которые я установил в своих подклассах.

Мои объекты определены как:

@Entity
@Table(name = "STORY")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DISCRIMINATOR_TYPE", discriminatorType = DiscriminatorType.STRING)
public abstract class Story extends AuditedEntity {}
@Entity
@Table(name = "USER_STORY")
@PrimaryKeyJoinColumn(name = "ID", referencedColumnName = "ID")
@DiscriminatorValue(value = "UserStory")
public class UserStory extends Story {}
@Entity
@Table(name = "SERVICE_ACCOUNT_STORY")
@PrimaryKeyJoinColumn(name = "ID", referencedColumnName = "ID")
@DiscriminatorValue(value = "ServiceAccount")
public class ServiceAccountStory extends Story {}
@Entity
@Table(name = "LAB_ENGAGEMENT_STORY")
@PrimaryKeyJoinColumn(name = "ID", referencedColumnName = "ID")
@DiscriminatorValue(value = "LabEngagement")
public class LabEngagementStory extends Story {}

Я ожидаю, что смогу выполнить запрос к базовой сущности с кодом, таким как:

final CriteriaQuery<Story> criteriaQuery = entityManager.getCriteriaBuilder().createQuery(Story.class);
        criteriaQuery.select(criteriaQuery.from(Story.class));

final TypedQuery<Story> typedQuery = entityManager.createQuery(criteriaQuery);

final List<Story> results = typedQuery.getResultList();

ииспользовать значение дискриминатора для создания экземпляра правильного типа Story, чтобы мои результаты содержали истории как UserStory, так и ServiceAccountStory.Вместо этого я получаю ошибку, отмеченную выше.

Я могу успешно запросить подклассы, выполнив запрос к сущности подкласса:

final CriteriaQuery<UserStory> criteriaQuery = entityManager.getCriteriaBuilder().createQuery(UserStory.class);
        criteriaQuery.select(criteriaQuery.from(UserStory.class));

final TypedQuery<UserStory> typedQuery = entityManager.createQuery(criteriaQuery);

final List<UserStory> results = typedQuery.getResultList();

, но тогда я получу только список UserStories.

Неясно, какое значение задает дискриминатор, если он не позволяет работать с базовым классом.Если мне нужно указать подкласс, я уже точно знаю тип, с которым имею дело, и мне не нужен дискриминатор.

Я что-то не так делаю?Мои ожидания неверны?

...