Override d'une annotation de validateur mise en veille prolongée?
-
20-09-2019 - |
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
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 ...