我有一个使用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 {}
我希望能够使用以下代码对基本实体运行查询:
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的列表。
目前尚不清楚如果不允许对基类进行工作,则鉴别器设置将提供什么值。如果我需要指定子类,我显然已经知道我要处理的类型,不需要区分符。
我做错什么了吗?我的期望错了吗?