3

弁別子に複数の列が必要な単一のテーブルがある場合、@ DiscriminatorFormulaを使用する唯一の解決策はありますか?

いくつかのプロトタイピングが私たちに説明できないいくつかの結果を与えたので、私は尋ねます。

失敗したプロトタイプ:最初に、スーパークラスで1つの@DiscriminatorColumnを使用し、サブクラスで2番目の@DiscriminatorColumnを含めて、3つの深さのクラス階層のプロトタイプを作成しました。もちろん、この警告が表示されました。

識別子列はルートエンティティで定義する必要があり、サブクラスでは無視されます

更新は機能しましたが、挿入は機能しませんでした。そこで、そのアイデアを破棄しました。

成功?プロトタイプ: 次に、機能すると思われる次のことを試しました。サブクラスの2番目の@DiscriminatorColumnを省略し、外部キー(とにかく必要になる)に@JoinColumnを含めるだけです。おそらく、結合はさまざまなタイプのオブジェクトに対するものであるため、Hibernate/JPAはどのサブクラスが正しいかを判断できるようです。誰かがそれを説明できますか?

それを破棄し、@ DiscriminatorFormulaを使用して、2つのディスクリミネーター列で定義された明示的な関係を取得する必要がありますか?

4

2 に答える 2

13

DiscriminatorFormulaは、DiscriminatorColumnの代替手段です。スーパークラス(デフォルトとして実際のテーブルをマップする)にそれらの1つで注釈を付けます。DiscriminatorColumnを使用すると、ディスクリミネーター値を含む追加の列(デフォルトでは「dtype」と呼ばれます)が作成されます。注釈をスーパークラスに配置します。

@Entity
@Table(name = "features")
@DiscriminatorColumn
public class Features{
    //valid code
}

DiscriminatorFormulaを使用すると、データベースの行の内容を確認し、ディスクリミネーターの値でサブクラスを「選択」できます。追加の(「dtype」)列は作成されません。メインクラスでは、次のようにスーパークラスに式で注釈を付けます。

@Entity
@Table(name = "features")
@DiscriminatorFormula(
        "CASE WHEN num_value IS NOT NULL THEN 'NUMERIC' " +
        " WHEN txt_value IS NOT NULL THEN 'TEXT' end"
)
public class Features{
    //valid code
}

DiscriminatorFormulaでは、必要なことを実行するために純粋なSQLを配置するだけです。

これらの2つのオプションのいずれかを選択でき、サブクラスはどちらの場合もまったく同じです。サブクラスでは、次のように識別子の値を指定します。

@Entity
@DiscriminatorValue('NUMERIC')
public class NumericFeatures extends Features {

    private Double numValue;

    public Double getNumValue() {
        return numValue;
    }

    public void setNumValue(Double numValue) {
        this.numValue = numValue;
    }

    //valid code
}

「features」というテーブルには、対応する値を含む「num_value」列と「txt_value」列の両方があります。DiscriminatorColumnを使用すると、追加のdtype列に「NUMERIC」または「TEXT」の値があり、「num_value」列と「txt_value」列の両方があります。

継承戦略を指定しない場合、デフォルトは「SINGLE_TYPE」です。選択した戦略の場合は、次の注釈を省略できます。

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

このアノテーションの有無にかかわらず、「機能」と呼ばれる1つのテーブルを取得します。

于 2014-11-05T13:57:44.367 に答える
1

DiscriminatorFormulaを使用するように切り替えましたが、今は問題なく動作します。

于 2013-05-08T20:55:35.783 に答える