4

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

これを実装するために、ドメイン クラスで beforUpdate イベントを使用し、そこからログ サービスを呼び出して、ユーザー ドメインの ID を渡します。この ID を使用して、サービス内のユーザー インスタンスを取得し、上記の指定された方法を使用してフィールドが汚れているかどうかを確認できますか? または、UserController の更新定義で実際に更新を行っているときに、監査をログに記録する必要がありますか?

より良いアプローチはどれですか?

これが正しいアプローチかどうかを確認したい..
また、他に注意する必要があることは次のとおりです
。1) 属性がドメインオブジェクト参照であり、単純な型ではない場合。
2)ドメインクラスからのサービスへの呼び出しでこれを実装することを考えて、休止状態セッションをフラッシュしないように注意する必要があるその他のこと。
よろしく、
プリヤンク

編集:更新アクティビティのログを監査したいユーザードメインのbeforeUpdateイベントでこれを試しました..

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

Service のメソッドでは、次のことを行います。

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セットを取得しています...コミット前に1回、コミット後に1回イベントが2回呼び出されます...??
2)Hibernate例外を削除または処理する方法(関数でwithNewセッションを使用しようとしましたが、違いはありません

事前に感謝します..

4

1 に答える 1

0

監査ログに GORM イベント ハンドラーを使用する代わりに、監査ログ プラグインを使用します。これにより、あなたの多くの痛みが取り除かれます。

お役に立てれば。

また

自分が行っていることをより細かく制御したい場合は、Hibernate の EmptyInterceptor のサブクラスの使用を検討する必要があります。これはあなたのために牽引の目的を果たします

  1. 監査ログの内容と方法をより細かく制御できます
  2. は、監査ログのすべてのロジックを 1 か所に配置するため、コードの保守に役立ちます。

ここをクリックして、EmptyInterceptor の API を確認してください。

: Hibernate はこのクラスの実装を出荷しておらず、デフォルトの動作を提供する可能性のあるこのクラスのサブクラスも提供していません。そのため、カスタム実装を作成する必要があります。

于 2012-03-15T05:29:50.963 に答える