2010-02-16 73 views
2

我想在hibernate验证器中重写一个约束。这里是我的基类:覆盖hibernate验证程序注释?

@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:实体映射中的重复列(正常,由于重复的getter)

在Hibernate/jpa中有一个@AttributeOverride,但它似乎只运行列重写,而不是这种类型的贡。

我该怎么办?

感谢

回答

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

} 

我还没有找到更好的......