2010-12-01 3 views
2

클래스에 상속 구조가 있으며, 상위 클래스 (루트 클래스) 및 하위 클래스 (하위)로 가정 해 봅시다. JPA 2.0 : TYPE 표현식 예외

그래서 JPA 2.0에는 난 단지 부모의 항목과 아이의되지도 항목을 반환해야합니다

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

이를 사용하여 단지 부모 클래스를 선택할 수 있습니다.

그러나 글래스 피시 v3에서 내 EclipseLink가 2.1.1와 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 매핑을 정의하지 않습니다. 이것은 배포시 자동으로 수행됩니다.

상속 구조를 선언하기 위해 부모/자식 클래스 (주석)에 추가해야 할 것이 있습니까? (그러나 나는 그것이, 상속 자바 선언되어 있기 때문에이 필요하지한다고 생각?)

편집 :
내가 언급하지 않은 한 가지 중요한 측면은 내가 사용하고 있다는 것입니다 상속 방법 "TABLE_PER_CLASS".

+0

이 링크는'를 사용하여 휴대용 상속 매핑 Strategies'하여 JPA 공급자가 수행하더라도 '그 주제에 언급했다 http://www.oracle.com/technetwork/articles/marx-jpa-087268.html 선택적 "테이블 당 구체 클래스"상속 매핑 전략을 구현하면 JPA 제공자 이식성이 필요한 경우이를 피하는 것이 가장 좋습니다 .' 그리고 단일 상속을 사용하는 것이 좋습니다. – Ramsharan

답변

4

내가 전에 말한 것을 잊어 버리십시오. 이 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(); 
} 

데이터베이스 (나는 오라클을 사용하고 있습니다) 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 인터페이스를 통해 올바르게 구현되지 않을 수 있습니다.

0

Jum Tough의 솔루션이 저에게 효과적이지 않습니다. 그러나이 문제는 상속 메서드 "TABLE_PER_CLASS"와 함께 다른 모든 상속 전략과 함께 사용할 수 있으며 형식 식은 정상적으로 작동합니다.

명시 적 표현식이 TABLE_PER_CLASS와 작동하지 않는다고 명시하는 JPA 2 스펙에서 아무것도 찾을 수 없기 때문에 이것이 EclipseLink의 버그라고 생각합니다.

게리

관련 문제