Frage

Ich möchte eine Einschränkung im Hibernate -Validator überschreiben. Hier ist meine Basisklasse:

@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;
    }
}

Ich habe eine untergeordnete Klasse, in der ich angeben möchte, dass der Gleichungstyp für Gleichungsfeld GleichungType.another_equation ist, so etwas wie folgt:

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

}

Dieser Code wirft eine Ausnahme aus, dass ich eine org.hibernate.mapPingexception: wiederholte Spalte in der Mapping für Entität habe (normal, aufgrund des doppelten Getters)

Es gibt eine @AttributeOverride in Hibernate/JPA, aber es scheint nur mit Spaltenüberschreibung und nicht mit dieser Art von Attribut zu laufen.

Wie kann ich es tun ?

Danke

War es hilfreich?

Lösung

Nun ... ich habe einen Tipp gefunden, um es zu erreichen ... das ist nicht sehr sauber ... aber es läuft:

Hier ist meine Basisklasse:

@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;
    }
}

Sie müssen den Getter als @Transient angeben, denn wenn nicht, hibernate wirft eine doppelte Definition für das Feld Gleichung. Mein Gleichungsfeld ist jetzt geschützt und nicht privat.

Und nun überschreiben Sie auf jeder Ihrer Unterklasse die GetEquation, indem Sie die Einschränkung angeben (und als @Transient nicht durch Unterklassen vererbt wird, wird die Überschreibung für die Gleichungsfeldzuordnung verwendet).

Hier ist ein Unterklassenbeispiel:

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

}

Ich habe nicht besser gefunden ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top