2010-02-16 75 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; 
    } 

} 

我還沒有找到更好的......