ДискриминаторФормула

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

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

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

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

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

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

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


person John Duff    schedule 30.09.2011    source источник
comment
Не могли бы вы опубликовать код об успешном прототипе?   -  person Jason Pyeron    schedule 24.10.2011
comment
DiscriminatorColumn в конце концов не работал. Я переключил его на использование DiscriminatorFormula, и теперь он работает нормально. Спасибо.   -  person John Duff    schedule 05.11.2011
comment
Отличная работа, Джон Дафф. Не могли бы вы сами опубликовать ответ на вопрос, а затем принять его, чтобы мы могли закрыть этот вопрос? Кроме того, вам необходимо принять ответы на предыдущие вопросы, если они решат вашу проблему.   -  person Zecas    schedule 23.05.2012


Ответы (2)


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 у вас будет либо значение «NUMERIC», либо «TEXT» в дополнительном столбце dtype, а также столбцы «num_value» и «txt_value».

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

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

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

person Laura Liparulo    schedule 05.11.2014

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

person John Duff    schedule 08.05.2013