There's an issue in the Cayenne tracker that contains patches against Cayenne 2.0 I've used to do this in the past:
https://issues.apache.org/cayenne/browse/CAY-414 I've done it by creating custom accessors like Robert Zeigler suggests in my cayenne Entity templates as well, but I think the patch is easier to maintain. On Fri, Feb 22, 2008 at 11:41 AM, Andrus Adamchik <[EMAIL PROTECTED]> wrote: > One more way of doing that, based on the internal Cayenne mechanism > for tracking all object changes as instances of GraphDiff: > > > http://cayenne.apache.org/doc20/api/cayenne/org/apache/cayenne/graph/GraphDiff.html > > There is no public API to access the diffs directly, but you can > intercept and process diffs on commit. Normally a > DataContext.getChannel() would return a DataDomain. A user can replace > it with a wrapper (via 'context.setChannel(..)') that delegates all > DataChannel operations to the DataDomain: > > > http://cayenne.apache.org/doc20/api/cayenne/org/apache/cayenne/DataChannel.html > > In the wrapper you can override 'onSync' to analyze/capture all the > diffs being sent to the DataDomain for commit. > > Andrus > > > > > > > On Feb 22, 2008, at 6:09 PM, Robert Zeigler wrote: > > Hi, > > > > I had a requirement very similar to this in a recent project. > > Every change made to a set of objects had to be recorded to be able > > to provide a history of changes to an object. > > What I did was to have those objects descend from a common super > > class, which, in turn, descends from CayenneDataObject. > > In my superclass, I overrode writeProperty and setToOneTarget. You > > get the new values passed into you, and you have a chance to examine > > the old values, as well, by calling readProperty. It has worked out > > quite nicely. > > > > Here's a sample snippet from writeProperty: > > > > @Override > > public void writeProperty(String name, Object value){ > > Object old = readProperty(name); > > if (value == null) { > > if (old != null) { > > recordChange(name,name + " changed from " + > > labelFor(readProperty(name)) + " to " + labelFor(value)); > > } > > } else if (!value.equals(old)) { > > recordChange(name,name + " changed from " + > > labelFor(readProperty(name)) + " to " + labelFor(value)); > > } > > super.writeProperty(name, value); > > } > > > > recordChange handles recording the changes for me; labelFor takes an > > object and converts it into a string suitable for user consumption. > > > > HTH, > > > > Robert > > > > On Feb 22, 2008, at 2/228:59 AM , Ilya Lazarev wrote: > > > >> Apologies if this has been asked before, I couldn't find anything > >> in the > >> archives. The problem boils down to this: there is a cayenne object > >> which is > >> updated via a form. I want to capture changes made to every single > >> modified > >> field in a DB, the value before modification and the value after. > >> The object > >> has a number of to-many relationships, which would also have to be > >> checked > >> one by one. The simplest way I can envision this is by manually > >> creating an > >> object clone before any modifications are made, and then comparing > >> the two > >> objects and noting the differences. Is there an easier way to see a > >> diff of > >> the fields, perhaps by accessing properties of the cayenne object > >> itself? I > >> am using cayenne 2. > >> > >> Many thanks, > >> Ilya > > > > > >