Ответ 1
Вы можете сопоставить свой дискриминатор как свойство только для чтения:
public class ApplicationProcess {
...
@Column(name = "apType", insertable = false, updatable = false)
private String apType;
}
Имеются следующие классы
@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");
Вы можете сопоставить свой дискриминатор как свойство только для чтения:
public class ApplicationProcess {
...
@Column(name = "apType", insertable = false, updatable = false)
private String apType;
}
Я могу представить несколько случаев, когда это может быть полезно, но, несмотря на то, почему вам это нужно, вы можете создать свой абстрактный метод класса, например
@Transient
public String getDiscriminatorValue(){
DiscriminatorValue val = this.getClass().getAnnotation( DiscriminatorValue.class );
return val == null ? null : val.value();
}
Мы вызываем метод, который принимает параметр ApplicationProcess как параметр, и я хочу избежать использования instanceof для проверки того, какой тип он есть. Было бы круче, если бы я мог сделать что-то вроде (...)
Я не думаю, что это было бы круче, это кажется хуже, чем вызов instanceOf
для меня: если по какой-либо причине вы измените значение дискриминатора, это сломает ваш код.
Если вам нужно проверить тип, используйте instanceOf
. Трюк с использованием дискриминатора не будет делать все лучше, это просто сделает ваш код менее надежным.
Вы можете использовать Формульную аннотацию. Если вы используете Hibernate, вы можете использовать следующий код в соответствии с эта ссылка:
private String theApType;
@Formula("apType")
String getTheApType() {
return theApType;
}
Конечно, вы сможете использовать его в своих запросах.