Anulación de una anotación de validación de hibernación?
-
20-09-2019 - |
Pregunta
Me gustaría para anular una restricción en el validador de hibernación. Aquí está mi clase 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;
}
}
Tengo una clase secundaria donde quiero especificar que el equationType de campo de ecuación es EquationType.ANOTHER_EQUATION, algo como esto:
@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 una excepción diciendo que tengo un org.hibernate.MappingException: repetida la columna en el mapeo de entidad (normal, debido al captador duplicado)
Hay un @AttributeOverride en Hibernate / JPA pero parece funcionar sólo con la anulación de la columna y no este tipo de atributo.
¿Cómo puedo hacerlo?
gracias
Solución
Bueno ... He encontrado una punta para lograrlo ... Eso no es muy limpio ... pero funciona:
aquí está mi clase 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;
}
}
Es necesario especificar el comprador como @Transient porque si no, Hibernate lanzar una definición duplicada para el campo de ecuación. Mi campo de ecuación está ahora protegida y no privadas.
Y ahora, en cada una de la subclase, se reemplaza el getEquation especificando la restricción (y como @Transient no se hereda por las subclases, la getEquation será anulado su uso para la asignación de campos ecuación).
Este es un ejemplo subclase:
@Entity(name = "CharacteristicUpgradeValue")
@DiscriminatorValue("CharacteristicUpgradeValue")
public class CharacteristicUpgradeValue extends Value
{
@Override
@SimpleEquation(equationType = EquationType.COST_VALUE)
public String getEquation()
{
return equation;
}
}
No he encontrado mejor ...