2012-03-28 34 views
0

我希望對某些表上的每個操作都進行記錄。我想在列級別的日誌記錄(不是所有,但一些),所以如果一個值已經改變了某些列我想記錄例如。在Apache Cayenne中獲取新數據對象

價格爲X產品已被用戶U

(假設價格&產品都在同一個表。)

爲了這個,我想監控產品X的價格列改變。

我不能使用觸發器來做到這一點,因爲我希望用戶也被記錄下來,用戶信息atm是門戶應用程序中的內容(無法將其傳遞給觸發器)。

我目前使用Apache辣椒和預更新(在實體類)再打我想比較新的價格(用戶在門戶網站已選擇)到一個坐在數據庫

當我嘗試從數據庫中獲取產品時,卡宴不會返回一個新對象,而是返回具有更改值的相同對象

我想知道是否有人知道某種方式卡宴可以爲我返回新鮮物體PK(ID)(多數民衆贊成我用什麼來獲得一個新的對象從數據庫)

可以通過其他方式給我建議

回答

2

有幾種方法可以解決這個問題。這是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();