Java 在Apache Cayenne中获取新的数据对象

Java 在Apache Cayenne中获取新的数据对象,java,jakarta-ee,orm,apache-cayenne,Java,Jakarta Ee,Orm,Apache Cayenne,我希望记录在某些表上执行的每个操作。我希望在列级别进行日志记录(不是全部,而是部分),因此,如果某个列的值已更改,我希望为eg记录该值 用户U已更改产品x的价格 (假设价格和产品在同一张表中。) 为此,我想监控产品x的价格栏 我不能使用触发器来实现这一点,因为我希望用户也被记录下来,用户信息是门户应用程序中的atm(不能将其传递给触发器) 我目前正在使用ApacheCayenne,在预更新(在entity类中)回调时,我想将新价格(用户在门户中选择的价格)与数据库中的价格进行比较 当我尝试从数据

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

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

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

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

我不能使用触发器来实现这一点,因为我希望用户也被记录下来,用户信息是门户应用程序中的atm(不能将其传递给触发器)

我目前正在使用ApacheCayenne,在预更新(在entity类中)回调时,我想将新价格(用户在门户中选择的价格)与数据库中的价格进行比较

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

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


你能给我一些其他的建议吗?

有几种方法可以解决这个问题。这是国际海事组织最透明的一个。诀窍是使用不同于提交更改的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();

有几种方法可以做到这一点。这是国际海事组织最透明的一个。诀窍是使用不同于提交更改的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();