Question

Je voudrais passer outre une contrainte dans validateur mise en veille prolongée. Voici ma classe de 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;
    }
}

J'ai une classe enfant où je veux préciser que le equationType pour le champ équation est EquationType.ANOTHER_EQUATION, quelque chose comme ceci:

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

}

ce code lancer une exception en disant que j'ai un org.hibernate.MappingException: colonne répétée dans la cartographie pour l'entité (normale, en raison du double getter)

Il y a un @AttributeOverride dans Hibernate / JPA mais il semble fonctionner uniquement avec priorité de la colonne et pas ce genre d'attribut.

Comment puis-je faire?

Merci

Était-ce utile?

La solution

Eh bien ... J'ai trouvé une astuce pour y parvenir ... Ce n'est pas très propre ... mais il fonctionne:

Voici ma classe de 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;
    }
}

Vous devez spécifier le getter @Transient parce que sinon, Hibernate lancera une définition en double pour le champ de l'équation. Mon champ d'équation est maintenant protégé et non privé.

Et maintenant, sur chacun de vos sous-classe, vous substituez la getEquation en spécifiant la contrainte (et @Transient n'est pas héritée par les sous-classes, la getEquation overriden sera utilisé pour la cartographie du champ d'équation).

Voici un exemple sous-classe:

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

}

Je ne l'ai pas trouvé mieux ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top