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

10

我有以下继承层次结构:

Task
  |
SpecificTask
  |
VerySpecificTask

我想使用单表继承来持久化它,因此我对类进行了注释:

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

@Entity
public class SpecificTask extends Task 

@Entity
public class VerySpecificTask extends SpecificTask

当我尝试保存VerySpecificTask类的对象时,会出现错误:

Unable to resolve entity name from Class [com.application.task.VerySpecificTask] 
expected instance/subclass of [com.application.task.Task]

我错在哪里?将多级继承映射到单个表格是否可行?

编辑:这里有一个愚蠢的错误,我很快解决了,所以我删除了它以免混淆这个问题。


2
你配置了鉴别器列吗?异常的堆栈跟踪是什么? - JB Nizet
我使用 AppFuse,鉴别器会自动设置。 - mrzasa
JSR 303 允许多级继承。你确定 appFuse 是否将注释应用于继承树中的第一层以外的层级? - Perception
1
我一定会确保所有自动化的东西都按照你的想法正确地设置和运行。如果有鉴别器列,它应该可以工作。 - AHungerArtist
3个回答

6

好的,我已经添加了辨别器列,现在它可以正常工作了。更改后的代码:

@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

我只是添加这个答案来提供一个被接受的答案——如果没有问题中有用的评论,我不会解决它。


3

接受的答案几乎完美。为了更清晰,我想在每个继承级别中添加一个@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   |...|
...

0
尝试使用@MappedSuperclass注释:
@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列的Order表。嵌入式超类属性映射将被复制到它们的实体子类中。请记住,虽然可嵌入的超类不是层次结构的根。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接