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