問題タブ [mappedsuperclass]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
98 参照

java - JPA エンティティで継承を最適にモデル化する方法

エンティティが主キーを共有していない場合、特にデータベースが既に存在し、簡単に変更できない場合、JPA エンティティで継承を使用するベスト プラクティスは何だろうと思っています。

Oracle HRの例で使用されているような従業員データベースがあるとします。さて、そのデータベースはあまり現実的ではありません。通常、給与は時間とともに変化します。給与がどのように変化したかを追跡します。たとえば、労働契約では、毎年 12 月に従業員がマネージャーと会い、翌年の給与について話し合うことが規定されている場合があります。

したがって、HR.EMPLOYEES から給与フィールドを削除し、新しいテーブル HR.SALARIES を作成します。

主キーは EMPLOYEE_ID と VALID_FROM で構成されます。

したがって、Pat が 12 月にマネージャーの Michael に会い、新しい給与に同意した場合、新しいレコードを HR.SALARIES に挿入します。

ここで、人事部が新しいデータを入力する際に​​ミスを犯したため、Pat が 1 月に誤った給与を受け取ったとします。彼女は問題を上司に報告し、上司は人事部に連絡し、HR.SALARIES の記録を修正します。彼女は 2 月の支払いで不足額を受け取ります。

年末には、会社の監査が行われます。監査人は、1 月に Pat に発行された給与小切手がデータベースの給与エントリと一致しない理由を知りません。監査人が、システムが特定の決定 (特定の金額の小切手を発行するなど) を行った理由を常に理解できるようにするために、変更履歴を保持する必要があります。

HR.SALARIES を次のように変更します。

新しいテーブル HR.SALARIES_CHANGE_HISTORY を追加します。

主キーは、EMPLOYEE_ID、VALID_FROM、および CHANGE_DATE で構成されます。

パフォーマンス上の理由から、変更履歴を別のテーブルに保持しています。HR システムによって読み取られることはほとんどありません。

いよいよ私の質問に行きます。CHANGE_DATE が HR.SALARIES_CHANGE_HISTORY.

JavaEE には @MappedSuperclass がありますが、最初は良さそうに思えますが、@MappedSupperclass を使用するクラス階層で異なる主キーを使用することはできません ( JSR-000338 JavaTM Persistence 2.1、セクション 2.4およびJSR 220: Enterprise JavaBeansTM,Versionを参照)。 3.0、セクション 2.1.4 )。

SALARIES と SALARIES_CHANGE_HISTORY のエンティティ Bean でコードの重複を避ける方法はありますか?

0 投票する
1 に答える
245 参照

spring - Spring - JPAは抽象クラスの抽象クラスに参加します

JPA 継承に問題があります。データベースモデルも特別に構築されています。同じ属性を持ついくつかのテーブルが含まれており (テーブルは意図的に国ごとにカットされています)、これらのテーブルはすべて別のテーブルに接続されています (OneToOne)。

データ モデルの例を次に示します: usa_user、germany_user、austria_user。これらのテーブルはすべて同じ属性 (id、name、address) を持っています。これで住所も、usa_address、germany_address、austria_address などの国に従って作成されました。

今、私はそれらを長い間正しくマッピングしてきたことを知らないか、問題を抱えています。私は次のものを持っています:

しかし、残念ながらこれはうまくいきません。開始するたびに、JPA は、エンティティ アドレス - ユーザーをマップできないことに気付きます (これは、エンティティではなく抽象クラスであるため理解できます)。これを解決する最善の方法は何ですか?冗長になるため、これらすべてのエンティティの属性をリストする必要は避けたいと思います。

@MappedSuperclass目標は、 aで aを使用する方法を見つけること@MappedSuperclassです。