Вопрос

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

@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, но, похоже, он работает только с переопределением столбца, а не с таким атрибутом.

Как мне это сделать ?

Спасибо

Это было полезно?

Решение

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

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

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

}

Лучшего я не нашел...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top