EclipseLink / JPA: несколько аннотаций @DiscriminatorColumn для сущности - PullRequest
3 голосов
/ 14 октября 2010

Я ищу способ в EclipseLink иметь два @DiscriminatorColumns на одном и том же объекте

Моя таблица БД PostreSQL:

Dictionary
{
  id,
  object_type,
  attribute_type,
  translation
}

И классы:

@Entity
@Table(name = "dictionary")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="object_type", 
                     discriminatorType=DiscriminatorType.INTEGER)
public class DictionaryRow implements Serializable;

@Entity
@DiscriminatorValue("0")
@DiscriminatorColumn(name="info_type", 
                     discriminatorType=DiscriminatorType.INTEGER)
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class DictionaryAttribute extends DictionaryRow;

@Entity
@DiscriminatorValue("1")
public class DictionaryAttributeName extends DictionaryAttribute;

Я пытаюсь добиться того, чтобы при вызове DictionaryAttributeName он преобразовывался в SQL, например:

select * from DICTIONARY where info_type = 1 and object_type = 0

Но на самом деле, он берет DiscriminatorColumn из класса DictionaryRow и DiscriminatorValue из DictionaryAttributeName, что приводит к совершенно неправильному SQL:

select * from DICTIONARY where object_type = 1

Есть ли решение для этой проблемы?

Спасибо

1 Ответ

2 голосов
/ 15 октября 2010

В соответствии со спецификацией JPA 2.0 это невозможно:

11.1.10 Аннотация DiscriminatorColumn

Для стратегии отображения SINGLE_TABLE и, как правило, также для JOINED стратегия, поставщик постоянства будет использовать столбец дискриминатора типа.Аннотация DiscriminatorColumn используется для определения столбца дискриминатора для стратегий отображения наследования SINGLE_TABLE и JOINED.

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

Ссылки

  • Спецификация JPA 2.0
    • Раздел 11.1.10 «Аннотация DiscriminatorColumn»"
...