Substituir uma anotação do validador de hibernato?
-
20-09-2019 - |
Pergunta
Eu gostaria de substituir uma restrição no validador de hibernato. Aqui está minha classe base:
@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;
}
}
Eu tenho uma aula infantil em que quero especificar que o campo EquationType for Equation é EquationType.another_equation, algo assim:
@Entity(name = "CharacteristicUpgradeValue")
@DiscriminatorValue("CharacteristicUpgradeValue")
public class CharacteristicUpgradeValue extends Value
{
@Override
@SimpleEquation(equationType = EquationType.COST_VALUE)
public String getEquation()
{
return super.getEquation();
}
}
Este código lançar uma exceção dizendo que eu tenho um org.hibernate.MapingException: Coluna repetida no mapeamento para entidade (normal, devido ao getter duplicado)
Existe um @AttributeVerride no Hibernate/JPA, mas parece ser executado apenas com a substituição da coluna e não esse tipo de atributo.
Como eu posso fazer isso ?
obrigado
Solução
Bem ... eu encontrei uma dica para alcançá -lo ... isso não é muito limpo ... mas funciona:
Aqui está minha classe base:
@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;
}
}
Você precisa especificar o getter como @Transient porque, se não, o Hibernate lançará uma definição duplicada para o campo de equação. Meu campo de equação agora está protegido e não privado.
E agora, em cada uma de sua subclasse, você substitui a get -sequação especificando a restrição (e como @Transient não é herdado por subclasses, o excesso de get -sequation será usado para o mapeamento de campo da equação).
Aqui está um exemplo de subclasse:
@Entity(name = "CharacteristicUpgradeValue")
@DiscriminatorValue("CharacteristicUpgradeValue")
public class CharacteristicUpgradeValue extends Value
{
@Override
@SimpleEquation(equationType = EquationType.COST_VALUE)
public String getEquation()
{
return equation;
}
}
Eu não encontrei melhor ...