2012-03-14 10 views
4

grailsドメインクラスでbeforUpdateイベントを実装しようとしています.Domains属性の古い値と新しい値の両方を監査する必要があります。 isDirtyのチェックを使用するか、Domain.dirtyPropertyNamesを使用してドメイン内の汚れているプロパティのリストを返すことができます。そしてgetPersistentValueは両方の値を持つことができるようにテーブル内の古い値を取得します。grailsで更新されたドメインプロパティの古い値を取得する

これを実装するには、ドメインクラスでbeforUpdateイベントを使用し、そこからログサービスを呼び出し、ユーザーのIDドメイン。今このIDを使用して私はサービスでユーザーインスタンスを取得し、上記の指定されたメソッドを使用して任意のフィールドが汚れていないかどうかを確認できますか? UserControllerのupdate defで実際にUpdateを行っているときにAuditを記録する必要がありますか?

どちらが良い方法ですか?

私は、この場合は適切なアプローチを確認したい。..
また、他のどのような私が世話をするために必要なもの、のように:
1)属性は、ドメインオブジェクト参照ではなく、単純なタイプである場合。
2)ドメインクラスからのサービス呼び出しでこれを実装しようと思って、休止状態のセッションをフラッシュしないように気をつける必要がある他のもの。
よろしく、
Priyank

編集:私はサービスのメソッドで

def beforeUpdate = { 
GraauditService service = AH.getApplication().getMainContext().getBean(''graauditService) 
     service.saveUserUpdateEntry(this.id); // id property of User domain... 
} 

は私が..私は更新アクティビティはログを監査するユーザードメインのBeforeUpdateイベントでこれを試してみました:

def saveUserUpdateEntry(Long id){ 
    User grauser = User.get(id); 
    println ("user="+ grauser) 
    println "Dirty Properties -: ${grauser.dirtyPropertyNames}" 
    println "Changed value for firstName = -: ${ grauser.firstName}" 
    println "Database value for firstName = -: ${ grauser.getPersistentValue('firstName')}" 

    } 

私は姓、ファーストネーム、電子メール用のUIからアップデートをしようと、コンソール上で以下のようになります。

user=com.gra.register.User : 1 
Dirty Properties -: [eMail, firstName, lastName] 
Changed value for firstName = -: sefser 
Database value for firstName = -: administer 

user=com.gra.register.User : 1 
Dirty Properties -: [] 
Changed value for firstName = -: sefser 
Database value for firstName = -: sefser 
possible nonthreadsafe access to session 

私が知っていることはできませんよ:
1)なぜ私は2セットを取得しています...二回前に一度コミットと呼ばれるイベントがあると、一度コミット後... ??
2)どのようにHibernateの例外を削除するか、ハンドルに(関数の中でwithNewセッションを使用しようとしたが、違いはありません事前に

おかげ..

+0

このpri_devを実行するにはさまざまな方法がありますが、最適なアプローチはおそらくビジネス要件が何であるかによって決まります。ログに記録されたすべての変更、または変更されたプロパティのみを変更しますか?このオブジェクトの更新頻度はどれくらいですか?これらの変更をGORMによってマッピングされたデータベース、ログファイルなどに永続化する予定ですか? –

+0

はい、私はデータベースのAuditLogドメインに追加したい、私はbeforeUpdateとその投げている休止状態例外からサービスへの簡単な呼び出しをしようとしました。私は編集セクションを追加しました –

+0

ドメインの2-3の属性を更新してsave()を呼び出すと、beforUpdateイベントが呼び出されますが、保存イベントとも呼ばれます。 createとupdateの両方がdomain.save()への呼び出しなので、私はHibernateが既存のドメインの新しいCreationとUpdateに基づいて異なるイベントを発生させるほどスマートであるかどうかを知りたいと思います。 –

答えて

0

ではなく、監査ログにGORMイベントハンドラを使用して、audit logging pluginを使用しています。これはあなたの多くの痛みを奪うだろう。

希望を、このことができます。

または

をあなたは非常に細かい制御をしたい場合は、あなたがしているものの上にHibernateのEmptyInterceptorのサブクラスの使用を検討する必要があります。あなた

  1. をあなたを維持するのに役立ちますこれ、一つの場所で監査ログのために、すべてのロジックを配置するかを、どのようにあなたが
  2. をログに記録する監査を行っている以上より細かい制御を与えるためにこれが牽引目的を果たすだろうコード。

Click here EmptyInterceptorのAPIを参照してください。

:Hibernateはこのクラス内の任意の実装を出荷していないと、また、あなたのデフォルトの動作を提供するかもしれない。この任意のサブクラスを提供していません。したがって、カスタム実装を記述する必要があります。

+0

これを試みましたが、一度にログオン..)彼らが持っている同じドメインを使用するのは難しい...そして、私たちは2つのテーブルを維持するつもりはないので、プラグインなしですべてを実装するだけでパンニング、また私はどのようにIDのプラグインを使用しているときに削除されているオブジェクト。 –

+0

このプラグインはわかりませんが、古いIDが 'oldmap'にあると仮定します。 – Peter

関連する問題