0

特定のテーブルで実行された各アクションをログに記録したい。列レベル(すべてではなく一部)でログを記録したいので、特定の列の値が変更された場合、たとえば.

製品 x の価格はユーザー U によって変更されました

(価格と製品が同じテーブルにあると仮定します。)

このために、製品 x の価格列を監視したいと考えています。

ユーザーもログに記録したいので、トリガーを使用してこれを行うことはできません。ユーザー情報 atm はポータル アプリケーションにあります (それをトリガーに渡すことはできません)。

現在、apache cayenne を使用しており、更新前 (エンティティ クラス内) のコールバックで、(ユーザーがポータルで選択した) 新しい価格をデータベースにある価格と比較したいと考えています。

データベースから製品を取得しようとすると、カイエンは新しいオブジェクトを返さず、値が変更された同じオブジェクトを返します

Cayenne が同じ pk(id) の新しいオブジェクトを返す方法を誰かが知っているかどうか疑問に思っていました (これは、db から新しいオブジェクトを取得するために使用しているものです)

また

別の方法でアドバイスできますか

4

1 に答える 1

3

これにアプローチするにはいくつかの方法があります。これは、IMOが最も透明なものです。秘訣は、変更をコミットするものとは異なる ObjectContext を使用することです。次に、現在保存されている値を含むオブジェクトの別のコピーを取得します。

// 'this' refers to the DataObject being committed (assuming things happen in its callback)

ObjectContext parallelContext = ... // create a new context here like you normally would

// 3.1 API; 3.0.x has a similar method with a slightly different sig
MyClass clone = parallelContext.localObject(this);

// if you are ok with cached old value, ignore the 'invalidateObjects' call.
// If not, uncomment it to ensure the object gets refetched. 
// Also 3.1 API. Should be easy to adjust for 3.0

// parallelContext.invalidateObjects(clone);

Object oldValue = clone.getXyz();
于 2012-03-28T07:43:20.500 に答える