Java Hibernate:是否可以将多级继承映射到单个表?

Java Hibernate:是否可以将多级继承映射到单个表?,java,hibernate,inheritance,persistence,single-table-inheritance,Java,Hibernate,Inheritance,Persistence,Single Table Inheritance,我有以下继承层次结构: Task | SpecificTask | VerySpecificTask 我想使用GN单表继承来保持它,所以我注释了类: @Entity @Table(name="task") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) public class Task @Entity public class SpecificTask extends Task @Entity public class

我有以下继承层次结构:

Task
  |
SpecificTask
  |
VerySpecificTask
我想使用GN单表继承来保持它,所以我注释了类:

@Entity
@Table(name="task")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class Task 

@Entity
public class SpecificTask extends Task 

@Entity
public class VerySpecificTask extends SpecificTask
当我试图保存VerysSpecificTask类的对象时,我得到一个错误:

Unable to resolve entity name from Class [com.application.task.VerySpecificTask] 
expected instance/subclass of [com.application.task.Task]
我错了什么?是否可以将多级继承映射到单个表

编辑:这里有一个跛脚的错误,我很快解决了,所以我删除了它,以免弄乱这个问题。

尝试注释:

@MappedSuperclass
public class BaseEntity {
    @Basic
    @Temporal(TemporalType.TIMESTAMP)
    public Date getLastUpdate() { ... }
    public String getLastUpdater() { ... }
    ...
}

@Entity 
public class Order extends BaseEntity {
    @Id public Integer getId() { ... }
    ...
}
在数据库中,此层次结构将表示为一个具有id、lastUpdate和lastUpdater列的订单表。嵌入的超类属性映射被复制到它们的实体子类中。记住,可嵌入的超类不是层次结构的根


好的,我添加了鉴别器列,现在它可以工作了。 更改代码:

@Entity
@Table(name="task")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
        name="DTYPE",
        discriminatorType=DiscriminatorType.STRING
    )

@Entity
public class SpecificTask extends Task 

@Entity
public class VerySpecificTask extends SpecificTask

(我添加它只是为了提供一个公认的答案——如果没有对问题的有用评论,我不会解决它。)

公认的答案几乎是完美的。为了更清楚,我想在每个继承级别上添加一个
@DiscriminatorValue

@Entity
@Table(name="task")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
        name="DTYPE",
        discriminatorType=DiscriminatorType.STRING
)
public class Task

---

@Entity
@DiscriminatorValue(value="DS")
public class SpecificTask extends Task 

---

@Entity
@DiscriminatorValue(value="DV")
public class VerySpecificTask extends SpecificTask
这张材料化的桌子看起来像

--------------- 
Table: task
---------------
|...|DTYPE|...|
---------------
|...|DS   |...|
|...|DV   |...|
|...|DS   |...|
...

您是否配置了鉴别器列?异常的堆栈跟踪是什么?我使用appFuse,disctiminator是自动设置的。JSR303允许多级继承。你确定appFuse应用的注释超过了继承树中的第一级吗?我肯定会确保所有automagic的东西都按照你的想法工作并正确设置。如果这有鉴别器列,它应该可以工作。