2

まず、PostgreSQLデータベースの永続性プロバイダーとしてJPA2.0とHibernate3.5を使用しています。

JPA 2.0アノテーションを介してデータベースのシーケンスを単一フィールド代理キーの自動生成値として正常に使用し、すべて正常に機能します。

現在、次の方法で混合キーを必要とするバイテンポラルデータベーススキームを実装しています。

Table 1:
id             (pk, integer, auto-generated-sequence)
validTimeBegin (pk, dateTime)
validTimeEnd   (dateTime)
firstName      (varChar)

今、問題があります。ご覧のとおりINSERT、新しい要素の場合、フィールドidは自動生成され、問題ありません。UPDATEただし、このスキーム内のフィールドが必要な場合はvalidTimeBegin、-fieldを変更せずに列を変更し、id次のように新しい行として挿入する必要があります。

行の更新前:

|---|-------------------------|-------------------------|-------------------|
| id|      validTimeBegin     |       validTimeEnd      |     firstName     |
|---|-------------------------|-------------------------|-------------------|
|  1| 2010-05-01-10:00:00.000 |                    NULL |            Gerald |
|---|-------------------------|-------------------------|-------------------|

正確に2010-05-01-10:35:01.788サーバー時間に発生する行の更新後:

(we update the person with the id:1 to reflect his new first name...)
|---|-------------------------|-------------------------|-------------------|
| id|      validTimeBegin     |       validTimeEnd      |     firstName     |
|---|-------------------------|-------------------------|-------------------|
|  1| 2010-05-01-10:00:00.000 | 2010-05-01-10:35:01.788 |            Gerald |
|---|-------------------------|-------------------------|-------------------|
|  1| 2010-05-01-10:35:01.788 |                    NULL |             Jerry |
|---|-------------------------|-------------------------|-------------------|

したがって、私たちの問題は、フィールドに自動生成されたシーケンスを使用すると、これがまったく機能しないことですid。新しい行を挿入すると、idは常に自動生成されますが、実際には複合キーの一部であり、動作する場合があります。別の方法で。

だから私の質問は:id同じ人の新しい品種を生成し、他のすべての場合に通常どおり続行したい場合に、JPAを介して休止状態にフィールドの自動生成を停止するように指示する方法はありますか?カスタムコードでID生成全体を引き継ぎますか?

よろしくお願いします、ジェラルド

4

2 に答える 2

2

だから...コメントなしでしばらく経ちましたが、今ではそれを行う方法はないと確信しています。実際、これが、開発者がアプリケーション側の独自のIDジェネレーターを介してデータベース用の独自のキーを生成し始める理由の1つです。このように、データベースは代理キーなどについてさえ知ることはありません。受け取るだけです。

ちなみに、このような行を更新するタスクに独自のメソッドを実装することで、問題を解決しました。これらのメソッドは現在OR-Mapperに依存しており、JPA 2.0に準拠していませんが、JPAはそのような動作のアノテーションをサポートしていません。

于 2010-11-12T13:12:24.680 に答える
0

AFAIKあなたのIDフィールドは、Hibernateが理解している意味でIDではありません。基本的にデータベース変更ログを実現したいという事実を踏まえて、別の解決策を提案する場合は、次のようにします。

  • ステップ0:IDをHibernateの主キーとしてのみ使用します。Postgresで複合主キーを使用します。
  • 手順1:validEndTimeが設定されているすべての行を自動的にフィルタリングするフィルターを休止状態に追加します。
  • 手順2:カスタム更新ステートメントを休止状態に追加します。代わりに挿入が行われます。
  • ステップ3:終了時刻を自動的に設定するトリガーをPostgreSQLに追加します。
  • ステップ4:Hibernateによるルックアップを高速化するために、postgresに制約付きインデックスを作成します。
于 2010-05-04T19:11:30.383 に答える