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 |...| 
...