Domanda

Vorrei ignorare un vincolo di Hibernate Validator. Qui è la mia classe di 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;
    }
}

Ho una classe figlia dove voglio specificare che l'equationType per il campo equazione è EquationType.ANOTHER_EQUATION, qualcosa di simile:

@Entity(name = "CharacteristicUpgradeValue")
@DiscriminatorValue("CharacteristicUpgradeValue")
public class CharacteristicUpgradeValue extends Value
{    
    @Override
    @SimpleEquation(equationType = EquationType.COST_VALUE)
    public String getEquation()
    {
        return super.getEquation();
    }

}

questo codice un'eccezione dicendo che ho un org.hibernate.MappingException: ripetuto colonna nella mappatura per entità (normale, a causa del getter duplicato)

C'è un @AttributeOverride in Hibernate / JPA ma sembra funzionare solo con la colonna di esclusione e non questo tipo di attributo.

Come posso fare?

grazie

È stato utile?

Soluzione

Beh ... ho trovato un suggerimento per realizzarlo ... Che non è molto pulito ... ma funziona:

qui è la mia classe di 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;
    }
}

È necessario specificare il getter come @Transient perché se non, Hibernate lancerà una definizione duplicata per il campo di equazione. Il mio campo di equazione è ora protetto e non privato.

E ora, su ciascuno dei sottoclasse, si ignora il getEquation specificando il vincolo (e come @Transient non è ereditata dalle sottoclassi, il getEquation sovrascritto sarà utilizzato per la mappatura campo di equazione).

Ecco un esempio di sottoclasse:

@Entity(name = "CharacteristicUpgradeValue")
@DiscriminatorValue("CharacteristicUpgradeValue")
public class CharacteristicUpgradeValue extends Value
{    
    @Override
    @SimpleEquation(equationType = EquationType.COST_VALUE)
    public String getEquation()
    {
        return equation;
    }

}

Non ho trovato meglio ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top