0

多くの既存のアプリケーション (MS Access、Delphi、Perl、C#、PHP などで記述) の複雑なシステムに JPA アプリケーションを追加しています。基礎となる MS-SQL データベースは、データベース トリガーを使用して、変更されたデータベース エントリのコピーを履歴データベース テーブルに書き込み、 と を追加SYSTEM_USERGETDATE()ます。

私の新しいJPAアプリケーションは接続プールを使用しているため、データベーステーブルのすべての変更は常にテクニカルユーザー(ユーザー:「Java」)によって行われ、JPAアプリケーションのすべての履歴データベーステーブルエントリには常にSYSTEM_USERとして「Java」が含まれます。

既存のトリガーを削除せずに、履歴テーブルにエントリを自動的に作成する方法は?

私は考えました:

  1. ユーザー「Java」がテーブルを変更し、自分で履歴データベーステーブルエントリを作成するたびに、既存のトリガーを開始しないように指示します。したがって、履歴データベース テーブルごとに新しいエンティティ クラスを多数作成する必要がありました。あまり便利ではありません。
  2. 接続プールを無効にし、変更ごとに個別の接続を作成します - 実際のユーザーを使用してデータベースに接続します。しかし、これにはパフォーマンス上の欠点があります。また、接続プールを無効にする方法がわかりません。
  3. 一時テーブルを使用して常に現在のユーザーを保存します - データベーストリガーは、履歴データベーステーブルにエントリを作成するときに、その保存されたユーザーを使用する必要があります
  4. 操作後に履歴データベース テーブル内のユーザーを手動で変更します。
4

1 に答える 1

0

1 - EclipseLink を使用している場合、その履歴サポートを使用できる可能性があります。http://wiki.eclipse.org/EclipseLink/Examples/JPA/Historyを参照してください。

2 - EclipseLink では、user/password プロパティを createEntityManager() に提供して、プールされていない接続を使用できます。http://wiki.eclipse.org/EclipseLink/Examples/JPA/Auditing#Provide_each_application_user_with_a_database_user_idを参照してください

4 - これには JPA または EclipseLink イベントを使用できます。

于 2013-03-07T14:27:46.727 に答える