2012-07-16 123 views
0

考慮以下實體。我打算讓孩子班級參考任何兩個衍生食品類(本地食品或外國食品)。這是一個人爲設計的例子,我的真實域對象非常複雜,因此,例如組合和使用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類映射爲具有繼承策略的實體,才能做到這一點。你這樣做的例外是什麼? – 2012-07-16 10:46:42

+0

我得到'引起:java.lang.ClassCastException:org.hibernate.mapping.SingleTableSubclass 引起:java.lang.ClassCastException:org.hibernate.mapping.JoinedSubclass'。對於每個InheritanceType。 – lawal 2012-07-16 11:18:30

+0

這是由映射問題引起的。例如,請參閱https://forum.hibernate.org/viewtopic.php?f=1&t=1005287。這個ID應該在根類(Food)中聲明。不在每個小類中。 – 2012-07-16 11:47:46

回答

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從子類中刪除。