2

我想覆盖休眠验证器中的约束。这是我的基类:

@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 是 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: Repeated column in mapping for entity (正常,由于重复的 getter)

Hibernate/jpa 中有一个@AttributeOverride,但它似乎只使用列覆盖而不是这种属性运行。

我该怎么做 ?

谢谢

4

1 回答 1

2

嗯......我找到了一个实现它的技巧......这不是很干净......但它运行:

这是我的基类:

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

您需要将 getter 指定为 @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;
    }

}

我还没找到更好的...

于 2010-02-17T09:08:19.883 回答