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
<andru..bjectstyle.org> 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:
> >
> > ..verride
> > 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
> >
> >
>
>
This archive was generated by hypermail 2.0.0 : Fri Feb 22 2008 - 17:01:52 EST