Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate如何在自引用指向基类型时进行自引用继承映射_Java_Hibernate - Fatal编程技术网

Java Hibernate如何在自引用指向基类型时进行自引用继承映射

Java Hibernate如何在自引用指向基类型时进行自引用继承映射,java,hibernate,Java,Hibernate,给定一个表“regions”,其中有一个类型字段指示行是“place”(类型id 1)或“attraction”(类型_id 2),并且还有一个父id,该父id引用与解释某个区域属于另一个表相同的表,其中空值指示其位于顶层。一个地方可以属于一个景点,一个景点也可以属于一个地方。这显然是一个多音映射 id |名称|类型| id |父项| id 1 |纽约| 1 |零 2 |中央公园| 2 | 1 我正在使用继承映射: @映射超类 公共类区域{ private Integer id; private

给定一个表“regions”,其中有一个类型字段指示行是“place”(类型id 1)或“attraction”(类型_id 2),并且还有一个父id,该父id引用与解释某个区域属于另一个表相同的表,其中空值指示其位于顶层。一个地方可以属于一个景点,一个景点也可以属于一个地方。这显然是一个多音映射

id |名称|类型| id |父项| id 1 |纽约| 1 |零 2 |中央公园| 2 | 1

我正在使用继承映射:

@映射超类 公共类区域{

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 {
}

但是,当我运行时,会引发以下异常:

org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.mystuff.Place.parent references an unknown entity: com.mystuff.Region
我能理解它来自哪里,因为地区不是一个实体

但是,正如我前面所解释的,一种类型的区域可以有任何类型的区域作为父区域。如果父区域的类型是固定的,我肯定可以在getParent方法中将其声明为返回类型。但是根据业务规则,在读取数据之前不可能知道父类型是什么


这里有什么建议可以解决我的问题?

区域应该用
@Entity
注释,而不是用
@MappedSuperclass
注释

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

链接的javadoc中有一些示例应该会有所帮助


另外,请将
景点
重命名为
景点
。该类的一个实例是一个景点,而不是很多景点。

我明白了。如果地点映射到多个区域类型会怎么样?我可以在DiscriminatorValue中指定一个值范围吗?(例如类型_id<100表示一个地点,而>=100表示一个景点?)感谢您对景点的重新命名!有多个值来标识一个独特的东西有什么意义:景点类型(或地点类型)?不,这是不可能的。但是Hibernate有一个DiscriminatorFormula注释。但是我不想使用它。但是我不想使用它。如果你有不同类型的位置,用它们自己的discriminator值创建子类,或者在适当的位置添加一个额外的列/字段placeType。
org.hibernate.AnnotationException: @OneToOne or @ManyToOne on com.mystuff.Place.parent references an unknown entity: com.mystuff.Region