Hibernate: Возможно ли отобразить многоуровневое наследование в одну таблицу?

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

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]

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

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

7 голосов | спросил mrzasa 3 FebruaryEurope/MoscowbFri, 03 Feb 2012 19:06:49 +0400000000pmFri, 03 Feb 2012 19:06:49 +040012 2012, 19:06:49

3 ответа


0

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

@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

(я добавляю его только для того, чтобы дать принятый ответ - я бы не решил его без полезных комментариев к вопросу)

ответил mrzasa 6 FebruaryEurope/MoscowbMon, 06 Feb 2012 12:26:37 +0400000000pmMon, 06 Feb 2012 12:26:37 +040012 2012, 12:26:37
0

Принятый ответ почти идеален. Чтобы было яснее, я хочу добавить @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   |...|
...
ответил Paul Wasilewski 17 Maypm16 2016, 17:16:53
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() { ... }
    ...
}
  

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

ответил Jean Logeart 3 FebruaryEurope/MoscowbFri, 03 Feb 2012 19:12:01 +0400000000pmFri, 03 Feb 2012 19:12:01 +040012 2012, 19:12:01

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132