Hi Robert, That was my first attempt. I overrode writeProperty() but then discovered that Embeddables don't call writeProperty(), but use a completely different method of updating attributes.
Thanks, mrg On Fri, Mar 11, 2011 at 4:40 PM, Robert Zeigler <[email protected]> wrote: > As a workaround, you could probably have a base class that overrides > writeProperty and checks to see if the new value is the same as the old value > before writing? (or a custom superclass template). > > Robert > > On Mar 11, 2011, at 3/113:14 PM , Michael Gentry wrote: > >> My particular use case in my Tapestry application is there are many >> different pages the user can edit before deciding to save. I wanted >> to display an "Unsaved Changes" message as they navigate around from >> page to page (combination of JavaScript for the current page and >> dataContext.hasChanges() when they move to a new page). However, >> Tapestry is always calling the setters when the form is submitted >> (page navigation, but not commitChanges()) and this is causing my >> "Unsaved Changes" message to always appear, even when they don't >> actually change values, because Tapestry has called all the setters >> with the original value. >> >> mrg >> >> >> On Fri, Mar 11, 2011 at 3:54 PM, Andrus Adamchik <[email protected]> >> wrote: >>> I'd rather we don't introduce a potentially expensive comparison in the >>> superclass setters. A setter may be called many times before a commit, so >>> the assumption is that it is much cheaper to only do comparisons once >>> during commit. >>> >>> I guess you can generate special setters with a custom template. Or we may >>> run pre-commit logic from within 'hasChanges'... >>> >>> Andrus >>> >>> >>> >>> On Mar 11, 2011, at 10:22 PM, Michael Gentry wrote: >>>> I just did a quick test using: >>>> >>>> DataContext dataContext = DataContext.createDataContext(); >>>> >>>> User user = dataContext.newObject(User.class); >>>> >>>> user.setFirstName("System"); >>>> user.setLastName("Administrator"); >>>> user.setUsername("admin"); >>>> >>>> dataContext.commitChanges(); >>>> >>>> user.setFirstName("System"); // This isn't a real change >>>> >>>> System.out.println(dataContext.hasChanges()); >>>> >>>> dataContext.commitChanges(); >>>> >>>> In a nutshell, create a user, commit it, set a value to the same >>>> value, then check hasChanges(). The output is: >>>> >>>> >>>> INFO: INSERT INTO Users (first_name, id, last_name, password, >>>> username) VALUES (?, ?, ?, ?, ?) >>>> INFO: [bind: 1->first_name:'System', 2->id:200, >>>> 3->last_name:'Administrator', 4->password:NULL, 5->username:'admin'] >>>> true >>>> >>>> The "true" is that the dataContext has changes, even though the second >>>> commitChanges() doesn't do anything (there are no real changes). >>>> Should we modify CayenneDataObject's writeProperty() to check if the >>>> old value and new value are equal before calling propertyChanged()? I >>>> was also noticing Embeddables doing something similar. >>>> >>>> Thanks, >>>> >>>> mrg >>>> >>> >>> > >
