2

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があることを示す例外をスローします:エンティティのマッピングで列が繰り返されます(通常、ゲッターが重複しているため)

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

ゲッターを@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 に答える