给定表“regions”,其具有指示行的类型字段是“地点”(类型id 1)或“吸引力”(type_id 2),并且还具有引用相同的父ID表解释一个区域属于另一个区域,其中空值表示它在顶层。一个地方可以属于一个景点,一个景点可以属于一个地方。它显然是一个ManyToOne映射。
id |名字| type_id | PARENT_ID 1 |纽约| 1 |空值 2 |中央公园| 2 | 1
我正在使用继承映射:
@MappedSuperclass 公共类别区域{
private Integer id;
private String name;
private RegionType type;
private Region parent;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false, unique = true)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name
}
@OneToOne
@JoinColumn(name = "type_id")
public RegionType getType() {
return type;
}
public void setType(RegionType type) {
this.type = type;
}
@ManyToOne()
@JoinColumn(name = "parent_id")
public Region getParent() {
return parent;
}
public void setParent(Region parent) {
this.parent = parent;
}
}
和两个子类:
@Entity
@Table(name="regions")
public class Place extends Region {
}
和
@Entity
@Table(name="regions")
public class Attractions extends Region {
}
但是当我运行时,会抛出以下异常:
org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.mystuff.Place.parent references an unknown entity: com.mystuff.Region
我可以理解它的来源,因为Region不是一个实体。
但是,正如我之前所解释的,一种区域可以将任何类型的区域作为父区域。如果父区域的类型是固定的,我肯定可以将其声明为getParent方法中的返回类型。但是,根据业务规则,在读取数据之前无法知道父类型是什么。
建议在这里解决我的问题?
答案 0 :(得分:2)
区域应使用@Entity
进行注释,而不是使用@MappedSuperclass
进行注释。
默认继承类型是SINGLE_TABLE,这正是您想要的。然后使用Region上的DiscriminatorColumn
注释指定哪个列用作鉴别器,并在子类上指定DiscriminatorValue
以指定在鉴别器列中用于子类的值。
链接的javadocs有一些应该有用的例子。
另外,请将Attractions
重命名为Attraction
。该类的一个实例是一个吸引力,而不是很多。