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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top