我希望记录在某些表上执行的每个操作。我希望在列级别进行日志记录(不是全部而是一些),因此如果某个列的值已更改,我想将其记录为例如。
产品x的价格已由用户U
更改(假设价格和产品在同一张表中。)
为此我想监控产品x的价格栏。
我不能使用触发器来执行此操作,因为我希望用户也被记录,用户信息atm是门户网站应用程序中的(无法将其传递给触发器)。
我目前正在使用apache cayenne并在更新前(在实体类中)回调我想比较新价格(用户在门户网站中选择的)与坐在数据库中的价格
当我尝试从数据库中获取产品时,cayenne不会返回一个新对象,而是返回具有更改值的同一对象
我想知道是否有人知道某种方式Cayenne可以为同一个pk(id)返回新的对象(这就是我用来从数据库中获取新对象的方式)
或
可以通过其他方式给我建议
答案 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();