9

私は古典的な休止状態@Inheritance(strategy=InheritanceType.SINGLE_TABLE)を持ってい@DiscriminatorFormulaます。それは正常に動作します。ただし、データベースには約 500 の異なる値があり@DiscriminatorValue、そのうちの約 30 を Java クラス (子) にマップし、残りを親 Java クラスにマップする必要があります。

この問題は、Animal クラスの継承の例としてモデル化できます。

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorFormula("...")
public class Animal implements Serializable {
  ...
  @Column
  public String getName() { ... }
}

だから私は Java コードで定義された Animal の約 30 のサブクラスを持っています@DiscriminatorValue。Hibernate がディスクリミネータの不明な値を検出すると、 がスローされWrongClassExceptionます。ただし、これらの未知の識別子の値を 1 つのエンティティにマップする必要があります。最適なのは Animal クラスです。(そのような場合は getName() メソッドのみを使用する必要があります。)

SQL CASE を に入れることが 1 つの解決策であることはわかっています@DiscriminatorFormulaが、30 の既知の識別子の値すべて (さらに、他の値を追加する必要がある場合はそれ以上) を記載する必要があります。そのため、より柔軟なソリューションを探しています。

PS レガシーコードですので、機種変更はできません。

4

2 に答える 2

8

tschoは私を正しい方向に向けてくれたので、自分の場合の解決策を見つけることができました。は@DiscriminatorValue特別な値@DiscriminatorValue("null")と を評価します@DiscriminatorValue("not null")。2番目は私にとって正しいです。

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorFormula("...")
@DiscriminatorValue("not null")
public class Animal implements Serializable {
  ...
  @Column
  public String getName() { ... }
}
于 2012-07-02T10:32:20.300 に答える
4

朗報です。この動作については、新しいユーザー ガイドに記載しました。これはJIRAの問題です。

基本的に、次の 2 つのオプションがあります。

  • @DiscriminatorValue("not null")基になるデータベース列の値と一致する明示的な識別子値のマッピングがない場合のフォールバック戦略として。
  • @DiscriminatorValue("null")データベース列の値が null の場合。通常、これは基本クラスに使用します。

Hibernate ブログにも詳細な例があります。

于 2016-07-18T15:01:32.050 に答える