1

私は非常に特定の問題で自分自身を打ちました。OpenJPA (KODO 4.1) を使用して、複数の列を識別子列として使用する方法はありますか?

私の問題は、これに似たテーブル構造(もちろん変更する能力が限られている)があることです:

Table  VEHICLE      EXPENSIVE_CAR  CHEAP_CAR       EXPENSIVE_BOAT    CHEAP_BOAT
---------------------------------------------------------------------------------
       HORSE_POWER  LUXURY_ACC     CLASIFICATION   SIZE              SIZE
       MEDIUM       EXTRAS                         TV_SIZE
       IS_EXPENSIVE CLASIFICATION

媒体がボートと車を区別し、高価な場合は、高価か安価かを区別します。

したがって、OpenJPA が提供する継承機能を使用してこれを実現する方法はありますか (休止状態でディスクリミネーター式を使用できることはわかっていますが、デフォルトの JPA プロバイダーから切り替えないようにしています)。

おまけとして、OpenJPA のカスタム識別子戦略について教えていただければ、それはもっともらしい解決策になる可能性があるという予感があるので、それは素晴らしいことです (ベンダーに依存しないものを好むとはいえ)

どうもありがとう

4

1 に答える 1

0

後ろ向きに始めましょう。

Discriminator 戦略は、階層内の関連エンティティを識別する列のタイプを定義します。JPA 1.x では、文字列 (これがデフォルト)、文字、および整数のいずれかになります。例:

import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@DiscriminatorColumn(name = "TYPE", discriminatorType = DiscriminatorType.STRING, length = 5)
@DiscriminatorValue("FOO")
public class Foo { ... }

@Entity
@DiscriminatorValue("BAR")
public class Bar extends Foo { ... }

@Entity
@DiscriminatorValue("BAZ")   
public class Baz extends Baz { ... }

デフォルトとして単一テーブル継承戦略を使用している場合、このセットアップは、階層内にあるこれらすべてのエンティティが親クラスのデータベース テーブルにマップされることを意味します。クラス Foo、Bar、および Baz の属性に加えて、TYPE と呼ばれる文字列型 (varchar-variant、長さ 5 の可能性が最も高い) と呼ばれる識別子列と、エンティティの種類ごとに、永続化されたときにそれぞれの識別子値が自動的に挿入されます。

JPQL で Bar または Baz エンティティを見つける場合、JPA は FOO テーブルからエンティティを見つけることができ (親エンティティのテーブルであるため)、discriminator 列の内容に依存することで、JPA プロバイダーはBar または Baz エンティティの作成を区別します。

弁別子の型を INTEGER または CHAR に設定すると、値 1、2、3 または "A"、"B"、"C" などをそれぞれ書き込むことができます。

次に、OpenJPA の質問に移ります。

私の知る限り、OpenJPA で複数の識別子の値を簡単に指定する方法はありませんが、より複雑なエンティティ階層を作成できるため、スキーマを変更できる場合は、Vehicle エンティティ、Car、Boat、および両方を作成できます。 ExpensiveBoat と ExpensiveCar です。

スキーマに固執する必要がある場合は、結合またはクラスごとのテーブル継承戦略を使用していると思います (ただし FIXME)。つまり、JPA が提供する識別子機能を使用できません。

于 2009-11-13T06:53:49.533 に答える