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

¿Fue útil?

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 ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top