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
>>> 
>> 
>> 

Reply via email to