Hibernate: Возможно ли отобразить многоуровневое наследование в одну таблицу? - PullRequest
8 голосов
/ 03 февраля 2012

У меня следующая иерархия наследования:

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]

Что я не прав? Можно ли отобразить многоуровневое наследование в одну таблицу?

РЕДАКТИРОВАТЬ: Здесь была ошибка, я решил быстро, поэтому я удалил ее, чтобы не путать этот вопрос.

Ответы [ 3 ]

5 голосов
/ 06 февраля 2012

ОК, я добавил колонку дискриминатора, и теперь она работает.Измененный код:

@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 голос
/ 17 мая 2016

Принятый ответ почти идеален.Чтобы сделать это более понятным, я хочу добавить @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

И таблица с материализацией выглядит так

0 голосов
/ 03 февраля 2012

Попробуйте аннотацию @ 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() { ... }
    ...
}

В базе данных эта иерархия будет представлена ​​в виде таблицы Order с столбцами id, lastUpdate и lastUpdater.Встроенные отображения свойств суперкласса копируются в их подклассы сущностей.Помните, что встраиваемый суперкласс не является корнем иерархии.

...