Perhaps this is because of my WO/EOF background, but I had always
assumed that modifying anything in the validate* methods would be a
Bad Thing and never tried doing it. I can't say I ever read it in
regards to Cayenne, but it feels like the right thing to me. Not sure
why it changed in behavior, though.
/dev/mrg
On 11/27/06, Bryan Lewis <[EMAIL PROTECTED]> wrote:
We have some code in a DataObject's validateForUpdate() method that
modifies the object's relationships. It had been working fine for over
a year, although it's not exercised very often because it's only called
when an employee leaves. Today it threw a ConcurrentModification, so
I'm guessing there was some related change in Cayenne in the last few
months. It reminds me of the guideline we used to follow with our old
WebObjects apps, shouldn't modify an object in -validateForSave... maybe
now that's a good rule in Cayenne too?
public void validateForUpdate(ValidationResult validationResult)
{
DataContext dc = getDataContext();
DataRow oldData =
dc.getObjectStore().getSnapshot(this.getObjectId());
Boolean oldIsActive = (Boolean) oldData.get("ISACTIVE");
Boolean newIsActive = getIsActive();
// If the employee is being made inactive...
if (oldIsActive.equals(Boolean.TRUE) &&
newIsActive.equals(Boolean.FALSE)) {
// Clear the employee's roles.
// Use a ListIterator to allow concurrent modification.
for (ListIterator it = getRoles().listIterator();
it.hasNext(); ) {
Role role = (Role) it.next();
it.remove();
removeFromRoles(role);
}
}
}
The exception:
org.objectstyle.cayenne.access.ObjectStoreGraphDiff.validateAndCheckNoop(ObjectStoreGraphDiff.java:109)
org.objectstyle.cayenne.access.DataContext.flushToParent(DataContext.java:1244)
org.objectstyle.cayenne.access.DataContext.commitChanges(DataContext.java:1165)
This is with Cayenne 1.2.1.