6

我有以下继承层次:Hibernate:是否可以将多级继承映射到单个表?

Task 
    | 
SpecificTask 
    | 
VerySpecificTask 

而且我想坚持它usign单表继承,所以我注释类:

@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

你已经配置了鉴别列?异常的堆栈跟踪是什么? – 2012-02-03 15:14:12

+0

我使用appFuse和disctiminator自动设置。 – mrzasa 2012-02-03 15:18:34

+0

JSR 303允许多级继承。您确定appFuse是在继承树的第一级应用注释吗? – Perception 2012-02-03 15:34:58

回答

4

OK,我已经添加了鉴别列,现在它的工作原理。 更改代码:

@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 

(我加入它只是提供一个接受的答案 - 没有有用的意见的问题,我不会解决这个问题。)

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() { ... } 
    ... 
} 

In database, this hierarchy will be represented as an Order table having the id, lastUpdate and lastUpdater columns. The embedded superclass property mappings are copied into their entity subclasses. Remember that the embeddable superclass is not the root of the hierarchy though.

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 

而且materiliazed表看起来像

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