Переопределение аннотации валидатора спящего режима?
-
20-09-2019 - |
Вопрос
Я хотел бы переопределить ограничение в валидаторе спящего режима.Вот мой базовый класс:
@Entity
@Table(name = "Value")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "valueType", discriminatorType = DiscriminatorType.STRING)
public abstract class Value extends CommonTable
{
private String equation;
@SimpleEquation(equationType = EquationType.EQUATION)
public String getEquation()
{
return equation;
}
public void setEquation(String equation)
{
this.equation = equation;
}
}
У меня есть дочерний класс, в котором я хочу указать, что тип уравнения для поля уравнения — EquationType.ANOTHER_EQUATION, что-то вроде этого:
@Entity(name = "CharacteristicUpgradeValue")
@DiscriminatorValue("CharacteristicUpgradeValue")
public class CharacteristicUpgradeValue extends Value
{
@Override
@SimpleEquation(equationType = EquationType.COST_VALUE)
public String getEquation()
{
return super.getEquation();
}
}
этот код выдает исключение, говорящее, что у меня есть исключение org.hibernate.MappingException:Повторяющийся столбец в сопоставлении для сущности (обычно, из-за дублирующего метода получения)
В Hibernate/jpa есть @AttributeOverride, но, похоже, он работает только с переопределением столбца, а не с таким атрибутом.
Как мне это сделать ?
Спасибо
Решение
Хорошо...Я нашел совет, как этого добиться...Это не очень чисто...но он работает:
вот мой базовый класс:
@Entity
@Table(name = "Value")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "valueType", discriminatorType = DiscriminatorType.STRING)
public abstract class Value extends CommonTable
{
protected String equation;
@Transient
public abstract String getEquation();
public void setEquation(String equation)
{
this.equation = equation;
}
}
Вам необходимо указать метод получения как @Transient, потому что в противном случае Hibernate выдаст дублирующее определение для поля уравнения.Поле моего уравнения теперь защищено и не является частным.
И теперь в каждом из ваших подклассов вы переопределяете getEquation, указав ограничение (и поскольку @Transient не наследуется подклассами, переопределенный getEquation будет использоваться для сопоставления полей уравнения).
Вот пример подкласса:
@Entity(name = "CharacteristicUpgradeValue")
@DiscriminatorValue("CharacteristicUpgradeValue")
public class CharacteristicUpgradeValue extends Value
{
@Override
@SimpleEquation(equationType = EquationType.COST_VALUE)
public String getEquation()
{
return equation;
}
}
Лучшего я не нашел...