ドメイン属性の古い値と新しい値の両方を監査ログに記録する必要がある 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セッションを使用しようとしましたが、違いはありません
事前に感謝します..