Использование TYPE для выбора только определенного класса с помощью свойства Inheritance.table_per_class - PullRequest
0 голосов
/ 26 ноября 2018

Представьте себе следующий сценарий, в котором мы используем стратегию наследования TABLE_PER_CLASS и Template в качестве суперкласса, а Product в качестве подкласса.

Template:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@Table(name = "Templates")
@NamedQuery(name = "getAllTemplates", query = "SELECT t FROM Template t")
public class Template implements Serializable { ...}

Product:

@Entity
@Table(name = "Product")
public class Product extends Template  implements Serializable { ... }   

В этом сценарии даже думал, что у меня в моей БД 2 шаблона и 1 продукт.Всякий раз, когда я вызываю шаблон с именемQuery, я получаю как продукты, так и шаблоны.

Я пытался сделать что-то вроде этого:

SELECT t FROM Template t WHERE TYPE(t) = Template

Однако он возвращает следующую ошибку: У класса нет дескриптораили дескриптор, который не использует наследование или использует ClassExtractor для наследования

Есть ли способ получить только шаблоны?

1 Ответ

0 голосов
/ 26 ноября 2018

Оператор TYPE также не работает для подклассов при использовании TABLE_PER_CLASS.Кажется, что нет явной информации об использовании TYPE с TABLE_PER_CLASS.

Однако есть много сообщений, в которых говорится, что эта стратегия неэффективна и ее не рекомендуется использовать.

Спецификации JPA 2.1 говорят оTABLE_PER_CLASS:

Поддержка стратегии отображения TABLE_PER_CLASS не является обязательной в этом выпуске.

Это также означает, что поддержка может быть только частичной: как поддержка TYPE не реализована.

Также есть некоторые сообщения, которые указывают, что от этого страдает не только Hibernate, см. (Некоторые довольно старые, но все же), такие как: this и this .

Итак, в заключение:

  • изменить стратегию SINGLE_TABLE или JOINED, если это возможно
  • жить с ней

В Hibernate вы также можете попробоватьзаставить его работать с @DiscriminatorColumn и добавить столбец к Template сущности, но я лично думаю, что это не стоит усилий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...