5

アプリケーションの構成用のドメインオブジェクトとそれに関連するテーブルのセットがあります。認証されたユーザーは、プレゼンテーション層を介してこれらのドメインオブジェクトデータを変更できます。これらの ドメインオブジェクトには非常に重要なデータがあり、誰がいつデータを変更したかを見つける必要があります。私のアプリケーションのデータアクセスレイヤーは、JPA、Hibernate、Springを使用して実装されています。ユーザー+アクション日付+アクションタイプ+以前の値で構成されるすべての変更の記録が必要です。

たとえば、些細なドメインオブジェクト(この質問の目的のために簡略化されています)を考えてみましょう。

@Entity
class Connection
{
   private Long id;
   private String name;
   private String protocol;
}

Connection次の値を持つインスタンスがあると想定します。

Connection 
    id = 1;
    name = Web;
    protocol = HTTPS;

ユーザー(例John)がUIにログインし、この接続を次の値に変更した後:

Connection
    id = 1;
    name = Web;
    protocol = HTTP;

ご覧のとおり、JohnはプロトコルをHTTPSからHTTP(安全なプロトコルから安全でないプロトコルに!)に変更しました。その結果Connection、監査可能にするためにインスタンスの履歴を別のテーブルに保存する必要があります。

私は自分のための解決策を研究し、次の結果を見つけました:

  1. トリガー: 1つの可能性は、テーブルにトリガーを定義することです。この方法の短所は、データベースへの依存関係です。
  2. Hibernate Envers:このソリューションは優れていますが、DAOレイヤーがHibernateに依存するようになり、JPAとそのプロバイダーの独立性のメリットが得られません。
  3. Spring Data Commons + hades:は良いですが、 : 、、、などMappedSuperClassの注釈によって任意のエンティティに列を追加しました。これは、エンティティの完全な履歴と状態を保存することを意味します。Create UserCreate DateLast Update UserLast Update Date
  4. 私自身の設計/実装: *この目標のためにレイヤーを実装することはできますが、この要件は私にとって特別なものではなく、ベストプラクティスに従って他の人によって解決されたと思うので、このソリューションは好きではありません(すべきではありません) t車輪の再発明)

誰かがこの問題の提案や解決策を持っていますか?

(私の質問が長く、専門家にとって基本的すぎる場合は申し訳ありません)

4

4 に答える 4

1

私は、監査目的でユーザーIDとタイムスタンプを追跡するためにデータベーステーブルに列を追加する多くのシステムで作業してきました。

以前の値を追跡する必要がある場合は、日付範囲を使用して、データがいつ有効であったかを知ることができます。例えば:

2012年1月1日から2012年12月31日までプロトコルはHTTPSでした2013年1月1日から「永遠に」プロトコルはHTTPでした

時間のパターンの詳細については、MartinFowlerのブログを参照してください。

于 2013-01-22T11:44:16.763 に答える
1

すでに Hibernate を使用している場合: Hibernate Audit/Envers が最適なソリューションです。

Hibernate を取り除きたい場合は、ソリューション #1/#4 に切り替えることができます。

于 2013-01-22T12:03:02.373 に答える
0

具体的な ORM との結合が気に入らない場合は、http://javers.org を使用できます。これは、汎用性が高く、SQL および NoSql データベースをサポートしているためです。

于 2015-04-02T09:14:22.113 に答える
0

Hibernate Envers を使用して、柔軟な監査を簡単に実現できます。

GitHub の私のプロジェクトには小さな起動例があります: jpauc-ear 。そして、使用例を含む公式ドキュメントを読んでください。

于 2013-02-04T00:56:27.610 に答える