我有以下继承层次结构:
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]
我错了什么?是否可以将多级继承映射到单个表?
编辑:这是一个蹩脚的错误,我很快就解决了,所以我删除了它以免弄乱这个问题。
答案 0 :(得分:5)
好的,我添加了鉴别器列,现在它可以工作了。 更改了代码:
@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
(我正在添加它只是为了提供一个可接受的答案 - 如果没有对问题的有用评论,我不会解决它。)
答案 1 :(得分:1)
接受的答案几乎是完美的。为了更清楚,我想在每个继承级别添加@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 |...|
...
答案 2 :(得分: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表。嵌入的超类属性映射将复制到其实体子类中。请记住,可嵌入的超类不是层次结构的根。