Hibernate如何做自我引用继承映射时自引用指向基类型

时间:2016-01-06 06:30:50

标签: java hibernate

给定表“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方法中的返回类型。但是,根据业务规则,在读取数据之前无法知道父类型是什么。

建议在这里解决我的问题?

1 个答案:

答案 0 :(得分:2)

区域应使用@Entity进行注释,而不是使用@MappedSuperclass进行注释。

默认继承类型是SINGLE_TABLE,这正是您想要的。然后使用Region上的DiscriminatorColumn注释指定哪个列用作鉴别器,并在子类上指定DiscriminatorValue以指定在鉴别器列中用于子类的值。

链接的javadocs有一些应该有用的例子。

另外,请将Attractions重命名为Attraction。该类的一个实例是一个吸引力,而不是很多。