ゴール
CREATE TEMPORARY TABLE
ネイティブ SQL を使用せずに Hibernateでステートメントを呼び出します。つまり、HQL または Hibernate API のみを使用します。- オブジェクトを一時テーブルに保存します。
- 既存のテーブルと一時テーブルを利用するストアド プロシージャを呼び出します。
DROP
終了時の一時テーブル。(必須ではないことはわかっていますが、そうするのは良い習慣だと思います。)
バックグラウンド
- 私は SQL に精通していますが、Hibernate は初めてです。
- プロジェクトで Hibernate を使用せざるを得なくなったのは、誰かの決定が原因です。
- Web フォームを Oracle データベースに保存します。
- Web フォームには、各セルに 1 つずつテキスト フィールド (他の人が設計したもの) でいっぱいのテーブルが含まれています。
- ユーザーが をクリックしたとき
Save
、値は単一のトランザクションで保存する必要があります。 - Web フォームは、データベース ビューによってバックアップされます。
- データベース ビューは、EAV パターンを使用してデータベース テーブルから作成されます。(これは、列が何らかの形で動的であるためです。)
- Web フォームの各テキスト フィールドは、データベース テーブルの 1 つの行によってモデル化されます。
- Web フォームを表示する
SELECT
には、ビューでステートメントを使用します。 - Web フォームの更新では、ビューのトリガー
UPDATE
を呼び出すビューのステートメントを使用します。INSTEAD OF
- 変更された値のみが更新されます。更新ごとに監査証跡があります。
- ユーザーの通知なしに別のユーザーによっていずれかの値が更新された場合、トランザクションはロールバックされます。このようなシナリオの例を次に示します。ユーザーが Web フォームを表示すると、別のユーザーが同じフィールドを更新し、最初のユーザーがフィールドを更新して Web フォームを送信したとき
(I)
の値が aになります。4
(II)
5
(III)
2
当初提案されたソリューション
- AJAX (jQuery) を使用してテキスト フィールドの変更を検出し、ユーザーが変更したものだけを送信します。
- ただし、別のユーザーによる変更は、データベースで検出する必要があります。
より適切に機能するはずのソリューション
- ユーザーが をクリック
Save
すると、一時テーブルが作成され (一時テーブルは現在のセッション/接続でのみ表示されるテーブルであり、セッションが閉じられるか切断されると自動的に削除されます)、オブジェクト (セル) を一時テーブルに保存します。 - 取引を開始します。
- 既存のテーブルの一部をロックします (パフォーマンスのために、関連する行のみをロックします)。
- 提出されたデータを既存のデータと比較します。
- 気付かない変更が行われた場合は、トランザクションをロールバックします。
- 必要な行を更新します。
- トランザクションをコミットし、テーブルのロックを解除します。
- 一時テーブルをドロップします。
何かアイデアはありますか?