2012-07-16 115 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从子类中删除。