Подтвердить что ты не робот

Как получить DiscriminatorValue во время выполнения

Имеются следующие классы

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // optional annotation as this is default
@DiscriminatorColumn(name = "apType", discriminatorType = DiscriminatorType.STRING, length = 255)
@DiscriminatorValue("AP")
public class ApplicationProcess {
}

И этот

@Entity
@DiscriminatorValue("APS")
public class ApplicationProcessScheme extends ApplicationProcess {
}

Теперь мне нужно знать во время выполнения, если ApplicationProcess имеет значение DiscriminatorValue AP or APS. Поскольку это автоматически обрабатывается jpa, у меня нет способа получить это значение.

Мы вызываем метод, который принимает параметр ApplicationProcess as, и я хочу избежать использования instanceof, чтобы проверить, какой тип он есть. Было бы прохладнее, если бы я мог сделать что-то вроде

applicationProcess.getApType().equals("AP");
4b9b3361

Ответ 1

Вы можете сопоставить свой дискриминатор как свойство только для чтения:

public class ApplicationProcess { 

    ...

    @Column(name = "apType", insertable = false, updatable = false)
    private String apType;

}

Ответ 2

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

@Transient
public String getDiscriminatorValue(){
    DiscriminatorValue val = this.getClass().getAnnotation( DiscriminatorValue.class );

    return val == null ? null : val.value();
}

Ответ 3

Мы вызываем метод, который принимает параметр ApplicationProcess как параметр, и я хочу избежать использования instanceof для проверки того, какой тип он есть. Было бы круче, если бы я мог сделать что-то вроде (...)

Я не думаю, что это было бы круче, это кажется хуже, чем вызов instanceOf для меня: если по какой-либо причине вы измените значение дискриминатора, это сломает ваш код.

Если вам нужно проверить тип, используйте instanceOf. Трюк с использованием дискриминатора не будет делать все лучше, это просто сделает ваш код менее надежным.

Ответ 4

Вы можете использовать Формульную аннотацию. Если вы используете Hibernate, вы можете использовать следующий код в соответствии с эта ссылка:

private String theApType;

@Formula("apType")
String getTheApType() {
    return theApType;
}

Конечно, вы сможете использовать его в своих запросах.