2012-07-16 4 views
0

다음 엔티티를 고려하십시오. Child 클래스가 두 개의 파생 된 음식 클래스 (Local Food 또는 Foreign) 중 하나를 참조하도록하려고합니다. 이것은 고의적 인 예입니다. 실제 도메인 객체는 매우 복잡하므로 FoodType 열을 결합하고 사용하는 것은 옵션이 아닙니다. 두 Food 하위 클래스는 거의 특성이 비슷하지 않기 때문입니다.기본 클래스에 대한 Hibernate/JPA 매핑

@MappedSuperclass 
public abstract class Food { 

} 



@Entity 
public class LocalFood extends Food { 

private long id; 
private String name; 
} 


@Entity 
public class ForeignFood extends Food { 

    private long id; 
    private String name; 
} 



@Entity 
public class Child {  
private Food food; //Base Class needed here 
@ManyToOne() 
public Food getFood() { 
    return food; 
} 
} 

Caused by: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on      com.sample.Child.food references an unknown entity: com.sample.Food 

상속 및 판별 자도 사용하지 않습니다.

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
public abstract class Food { 

private long id; // set , get (Auto gen) 
} 

이런 종류의 매핑을 사용할 수 있습니까?

+1

상속 전략을 사용하여 Food 클래스를 엔터티로 매핑해야합니다. 그렇게 할 때 예외는 무엇입니까? –

+0

나는'Caused by : java.lang.ClassCastException : org.hibernate.mapping.SingleTableSubclass 에 의해 발생했다 : java.lang.ClassCastException : org.hibernate.mapping.JoinedSubclass'. 각 상속 유형에 대해. – lawal

+0

이것은 매핑 문제로 인해 발생합니다. 예를 들어 https://forum.hibernate.org/viewtopic.php?f=1&t=1005287을 참조하십시오. 이 ID는 루트 클래스 (Food)에 선언되어야합니다. 모든 하위 클래스에있는 것은 아닙니다. –

답변

1

JB Nizet이 옳았습니다. 이제 음식 수업이 이렇게 생겼어.

@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) 
public abstract class Food { 

private long id; 

public void setId(long id) { 
    this.id = id; 
} 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
public long getId() { 
    return id; 
} 

} 

그리고 ID

는 서브 클래스에서 제거.

관련 문제