Override di un'annotazione Hibernate Validator?
-
20-09-2019 - |
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
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 ...