0

我希望记录对某些表执行的每个操作。我想在列级别(不是全部,而是一些)记录,所以如果某个列的值已更改,我想记录它,例如。

用户 U 更改了产品 x 的价格

(假设价格和产品在同一张表中。)

为此,我想监控产品 x 的价格列。

我不能使用触发器来执行此操作,因为我也希望用户被记录,用户信息 atm 位于门户应用程序中(不能将其传递给触发器)。

我目前正在使用 apache cayenne,并且在更新前(在实体类中)回调时,我想将新价格(用户在门户中选择的价格)与数据库中的价格进行比较

当我尝试从数据库中获取产品时,cayenne 不会返回一个新对象,而是返回具有更改值的相同对象

我想知道是否有人知道 Cayenne 可以通过某种方式为我返回相同 pk(id) 的新对象(这就是我用来从数据库中获取新对象的方法)

或者

可以用其他方式给我建议

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 回答