Переопределение аннотации спящего валидатора? - PullRequest
2 голосов
/ 16 февраля 2010

Я хотел бы переопределить ограничение в средстве проверки гибернации. Вот мой базовый класс:

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

У меня есть дочерний класс, в котором я хочу указать, что уравнение уравнения для поля уравнения равно EquationType.ANOTHER_EQUATION, что-то вроде этого:

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

}

этот код выдает исключение, говорящее, что у меня есть org.hibernate.MappingException: повторяющийся столбец в сопоставлении для сущности (обычный, из-за дублирующего получателя)

В Hibernate / jpa есть @AttributeOverride, но, похоже, он работает только с переопределением столбцов, а не с такими атрибутами.

Как я могу это сделать?

спасибо

1 Ответ

2 голосов
/ 17 февраля 2010

Ну ... я нашел совет, как этого добиться ... Это не очень чисто ... но работает:

вот мой базовый класс:

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

Вам необходимо указать получатель как @Transient, потому что в противном случае Hibernate выдаст дублирующее определение для поля уравнения. Мое поле уравнения теперь защищено, а не приватно.

И теперь в каждом из ваших подклассов вы переопределяете getEquation, указав ограничение (а поскольку @Transient не наследуется подклассами, переопределенный getEquation будет использоваться для отображения поля уравнения).

Вот пример подкласса:

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

}

Я не нашел лучшего ...

...