JPA 2.0:TYPE表达式exception

我有一个inheritance结构与类,让我们说Parent(作为根类)和Child作为子类。

因此,对于JPA 2.0,我不能通过使用仅选择Parent类

SELECT p FROM Parent p WHERE TYPE(p) = Parent 

这只应返回Parent的条目,而不是子条目。

但是我的EclipseLink 2.1.1和Glassfish v3上的MySql,我总是会收到以下错误:

 "Invalid Type Expression on [my.domain.Parent]. The class does not have a descriptor, or a descriptor that does not use inheritance or uses a ClassExctractor for inheritance". 

另外,我手动定义没有orm-mapping。 我认为这都是在部署时自动完成的。

有什么东西我必须添加到我的父/子类(注释即)来声明inheritance结构? (但我认为这不应该是必要的,因为inheritance是由Java声明的,是吗?)

编辑:
我没有提到的一个重要方面是我正在使用inheritance方法“TABLE_PER_CLASS”。

忘了我之前说过的话。 这适用于SINGLE_TABLE策略:

 @Entity @Table(name="PERSON") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name="GENDER", discriminatorType=DiscriminatorType.STRING, length=6) public abstract class Person implements Serializable { private static final long serialVersionUID = 1L; @Id @SequenceGenerator(name="PERSON_PERSONID_GENERATOR", sequenceName="PERSON_ID_SEQ") @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="PERSON_PERSONID_GENERATOR") @Column(name="PERSON_ID", updatable=false, unique=true, nullable=false, precision=22) private long personId; @Column(nullable=false, length=32) private String surname; @Column(name="GIVEN_NAME", nullable=false, length=32) private String givenName; // ... } @Entity @DiscriminatorValue("FEMALE") public class Daughter extends Person implements Serializable { @Column(name="NUMBER_OF_DOLLS", precision=22) private int numberOfDolls; // ... } @Entity @DiscriminatorValue("MALE") public class Son extends Person implements Serializable { @Column(name="NUMBER_OF_TOY_CARS", precision=22) private Integer numberOfToyCars; // ... } // JUnit test method public void testInheritance() { EntityManager em = createNewEntityManagerInstance(); EntityTransaction tx = em.getTransaction(); tx.begin(); Daughter d = new Daughter(); d.setGivenName("Sue"); d.setSurname("Smith"); d.setNumberOfDolls(5); em.persist(d); Son s = new Son(); s.setGivenName("Joe"); s.setSurname("Smith"); s.setNumberOfToyCars(8); em.persist(s); tx.commit(); Query q; List personList; Person p; q = em.createQuery("SELECT p FROM Person p WHERE TYPE(p) = Daughter"); personList = q.getResultList(); assertEquals(1, personList.size()); p = (Person)personList.get(0); System.out.println( "This Daughter is: " + p.getGivenName() + " " + p.getSurname()); q = em.createQuery("SELECT p FROM Person p WHERE TYPE(p) = Son"); personList = q.getResultList(); assertEquals(1, personList.size()); p = (Person)personList.get(0); System.out.println( "This Son is: " + p.getGivenName() + " " + p.getSurname()); q = em.createQuery("SELECT p FROM Person p"); personList = q.getResultList(); assertEquals(2, personList.size()); for (Object o : personList) { assertTrue(o instanceof Person); p = (Person)o; System.out.println( "This person is: " + p.getGivenName() + " " + p.getSurname()); } em.close(); } 

数据库(我使用的是Oracle)DDL看起来像这样:

 CREATE TABLE "DEV"."PERSON" ( "PERSON_ID" NUMBER NOT NULL ENABLE, "GIVEN_NAME" VARCHAR2(32 BYTE) NOT NULL ENABLE, "SURNAME" VARCHAR2(32 BYTE) NOT NULL ENABLE, "GENDER" VARCHAR2(6 BYTE) NOT NULL ENABLE, "NUMBER_OF_DOLLS" NUMBER, "NUMBER_OF_TOY_CARS" NUMBER, CONSTRAINT "PERSON_PK" PRIMARY KEY ("PERSON_ID") ); 

现在你说你正在尝试使用TABLE_PER_CLASS策略。 我无法帮助你,因为JPA 2.0规范说供应商不需要支持它 。 您的实现可能无法通过JPA接口正确支持它。

Jum Tough的解决方案对我不起作用。 但是问题只能与inheritance方法“TABLE_PER_CLASS”结合使用,并且所有其他inheritance策略类型表达式都可以正常工作。

我认为这是EclipseLink中的一个错误,因为我在JPA 2规范中找不到任何明显排除的内容,表明类型表达式不适用于TABLE_PER_CLASS。

格里