在Apache Cayenne中获取新数据对象

时间:2012-03-28 01:10:49

标签: java java-ee orm apache-cayenne

我希望记录在某些表上执行的每个操作。我希望在列级别进行日志记录(不是全部而是一些),因此如果某个列的值已更改,我想将其记录为例如。

产品x的价格已由用户U

更改

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

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

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

我目前正在使用apache cayenne并在更新前(在实体类中)回调我想比较新价格(用户在门户网站中选择的)与坐在数据库中的价格

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

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

可以通过其他方式给我建议

1 个答案:

答案 0 :(得分: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();