Я просто хотел улучшить отличный ответ @asa об обходном пути.Обычно нам часто нравится использовать столбец дискриминатора в качестве атрибута абстрактного класса, и, конечно, он отображается с enum
.Мы все еще можем использовать решение, упомянутое выше, и установить некоторую согласованность между enum
именами (используемыми для сопоставления столбца) и String
значениями (используемыми в качестве значений дискриминатора).Вот мое предложение:
public enum ELanguage {
JAVA(Values.JAVA), GROOVY(Values.GROOVY);
private ELanguage (String val) {
// force equality between name of enum instance, and value of constant
if (!this.name().equals(val))
throw new IllegalArgumentException("Incorrect use of ELanguage");
}
public static class Values {
public static final String JAVA= "JAVA";
public static final String GROOVY= "GROOVY";
}
}
А для сущностей вот код:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="LANGUAGE_TYPE", discriminatorType=DiscriminatorType.STRING)
public abstract class Snippet {
// update/insert is managed by discriminator mechanics
@Column(name = "LANGUAGE_TYPE", nullable = false, insertable = false, updatable = false)
@Enumerated(EnumType.STRING)
public ELanguage languageType
}
@Entity
@DiscriminatorValue(value=ELanguage.Values.JAVA)
public class JavaSnippet extends Snippet {
…
}
Все еще не идеально, но, думаю, немного лучше.