DiscriminatorFormula - PullRequest
       17

DiscriminatorFormula

3 голосов
/ 30 сентября 2011

Если у меня есть одна таблица, где мне нужно несколько столбцов для дискриминатора, могу ли я использовать единственное решение @DiscriminatorFormula?

Я спрашиваю, потому что некоторые прототипы дали нам некоторые результаты, которые я не могу объяснить.

Неудачный прототип: Изначально мы создали прототип трехуровневой иерархии классов, используя один @DiscriminatorColumn в суперклассе, и включили второй @DiscriminatorColumn в подклассы.Конечно, мы получили это предупреждение:

В корневом объекте должен быть определен столбец-дискриминатор, он будет игнорироваться в подклассе

Мы обнаружили, что обновления работают, но вставляетне.Итак, мы отказались от этой идеи.

Успешно?прототип: Затем мы попробовали следующее, что, кажется, работает: опустите второй @DiscriminatorColumn на подклассы и просто включите @JoinColumn во внешний ключ (который нам все равно понадобится).Возможно, поскольку объединения относятся к различным типам объектов, Hibernate / JPA, похоже, способен выяснить, какой подкласс является правильным.Кто-нибудь может объяснить это?

Должны ли мы отказаться от этого и просто использовать @DiscriminatorFormula, чтобы получить явное отношение, определенное в 2 столбцах дискриминатора?

Ответы [ 2 ]

7 голосов
/ 05 ноября 2014

DiscriminatorFormula является альтернативой DiscriminatorColumn. Вы аннотируете суперкласс (который отображает реальную таблицу по умолчанию) с одним из них. С DiscriminatorColumn он создает дополнительный столбец (по умолчанию называемый «dtype»), который содержит значение дискриминатора. Вы помещаете аннотацию в суперкласс:

@Entity
@Table(name = "features")
@DiscriminatorColumn
public class Features{
    //valid code
}

DiscriminatorFormula позволяет проверять содержимое строки базы данных и «выбирать» подкласс по значению дискриминатора. Дополнительный столбец ("dtype") не создается. В основном классе вы аннотируете суперкласс по формуле, например:

@Entity
@Table(name = "features")
@DiscriminatorFormula(
        "CASE WHEN num_value IS NOT NULL THEN 'NUMERIC' " +
        " WHEN txt_value IS NOT NULL THEN 'TEXT' end"
)
public class Features{
    //valid code
}

В DiscriminatorFormula вы просто добавляете чистый SQL, чтобы делать то, что вам нужно.

Вы можете выбрать один из этих двух вариантов, и подклассы в обоих случаях абсолютно одинаковы. В подклассах вы указываете значение дискриминатора, например:

@Entity
@DiscriminatorValue('NUMERIC')
public class NumericFeatures extends Features {

    private Double numValue;

    public Double getNumValue() {
        return numValue;
    }

    public void setNumValue(Double numValue) {
        this.numValue = numValue;
    }

    //valid code
}

В таблице под названием «Features» у вас есть оба столбца «num_value» и «txt_value», содержащие соответствующие значения. При использовании DiscriminatorColumn в дополнительном столбце dtype будет иметь значение «NUMERIC» или «TEXT», а также столбцы «num_value» и «txt_value».

Если вы не указали стратегию наследования, по умолчанию используется значение «SINGLE_TYPE». следующая аннотация может быть опущена, если это выбранная вами стратегия:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

С этой аннотацией или без нее вы получаете одну таблицу под названием «Функции».

1 голос
/ 09 мая 2013

Я переключил его на использование DiscriminatorFormula, и теперь он работает просто отлично.

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