0

私には最大10のクラスがあり、それぞれに2〜4つの値で構成される複合キーがあります。クラスの1つはメインクラス(「センター」と呼びましょう)であり、1対1または1対多として他のクラスに関連しています。

JPAでこれを記述する正しい方法を考えると、@ Embedded/@PrimaryKeyアノテーションを使用してすべての主キーを記述する必要があると思います。

質問1: 私の懸念は-データベースレベルで、「センター」PKの列の数に等しい「センター」を参照する各テーブルの追加の列の数があることを意味しますか?

はいの場合、参照に人工の一意キーを使用することでそれを回避することは可能ですか?この場合、実際のP​​Kと人工的なPKをどのように記述する必要があるかを教えてください。

注: PKとして一意のIDを使用するだけでなく、実際のP​​Kを保持したい理由は、アプリケーションに外部データソースからのデータ読み込み機能があり、ローカルデータベースに既にあるレコードを返す場合があります。一意のIDがPKとして使用される場合、新しいレコードの場合、ダウンロードしたばかりの一意のIDは使用できないため、データの更新はできません。同時に、これはアプリケーションの通常のシナリオであり、新しいレコードの挿入を更新する必要があるのは、実際の複合主キーが一致するかどうかによって異なります。

質問2:10 のクラスすべてに、それぞれが拡張する抽象クラスで説明した共通のフィールド「日付」があります。「日付」自体がキーになることはありませんが、常に各クラスの複合キーの一部です。複合キーはクラスごとに異なります。このフィールドをPKの一部として使用できるようにするには、各クラスでこのフィールドを説明する必要がありますか、それともそのまま使用する方法はありますか?@Embeddedアノテーションと@PrimaryKeyアノテーションを試してみたところ、eclipselinkが抽象クラスに記述されたフィールドを見つけることができないというエラーが常に発生しました。

前もって感謝します!

PS。最新バージョンのeclipselink&H2データベースを使用しています。

4

2 に答える 2

3

私のアドバイス: 機能的な複合キーのことは忘れてください: それらは非効率的であり、使用するのは悪夢です。すべてのエンティティに対して、単一列の自動生成されたキーを使用するだけです。これには、テーブルを短くきれいにする (列を減らす) という利点もあります。

これは、たとえば、列 col1、col2、および col3 に対して a、b、および c を持つレコードが 1 つだけであることを確認するために、一連の列に一意の制約を作成することを妨げません。

そして、a、b、c のレコードが既に存在するかどうかを確認したい場合は、クエリを作成するだけです。

select center from Center center 
where center.col1 = :col1 
and center.col2 = :col2
and center.col3 = :col3
于 2012-12-11T11:02:21.817 に答える
1

見る、

http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Composite_Primary_Keys

複合キーに関する情報。

通常は、生成された単一の ID を使用する方が適切ですが、レガシー データがある場合は、複合キーを使用できます。

@EmbeddedId の使用はお勧めしません。代わりに @IdClass を使用すると、はるかに簡単になります。TopLink は @IdClass を必要としませんが、find() を使用する場合は、キー値を作成するために必要です。

@MappedSuperclass を使用して id フィールドの 1 つを定義できるようにする必要があります。各キー フィールドに @Id で注釈を付けてください。

TopLinkでは、 @PrimaryKey 注釈を使用して複合キーの指定を簡素化できます。列のリストを指定するだけで済みます。これらの列をクラスの属性にマップする必要があります。

于 2012-12-11T15:17:05.450 に答える