Todd, are you using T3 or T4? Your session is serializable, right?
Thanks,
/dev/mrg
-----Original Message-----
From: Todd O'Bryan [mailto:toddobrya..ac.com]
Sent: Monday, February 20, 2006 6:53 AM
To: cayenne-use..bjectstyle.org
Subject: Re: Validation error that shouldn't be (I don't think)
OK. I'm stumped...here's the whole code for the method that's causing
the problem, along with the exception iterator that Andrus suggested
at the bottom, and a few other print statements sprinkled throughout.
I should emphasize that, if I include the if statement that's
commented out, this works. (Note also that the dbQuestions are always
null; I haven't even *started* testing the else.
public void commitToDb(DataContext dc) {
System.out.println(getAuthor());
/*if (getAuthor().getPersistenceState() ==
PersistenceState.HOLLOW) {
setAuthor((User)
dc.refetchObject(getAuthor().getObjectId()));
}*/
try {
if (dbQuestion == null) {
// create new one
dbQuestion = (ObQuestion)
dc.createAndRegisterNewObject
(ObQuestion.class);
dbQuestion.setAuthor(getAuthor());
dbQuestion.setType(getType());
dbQuestion.setIsVetted(Boolean.FALSE);
dbQuestion.addToData(ObQuestionDatum.createNew(dc, TEXT, getText
(), null));
dbQuestion.addToData(ObQuestionDatum.createNew(dc, EXPLANATION,
getExplanation(), null));
dbQuestion.addToData(ObQuestionDatum.createNew(dc, CORRECT_NUMBER,
null, getCorrectNumber()));
for (int i = 0; i < getChoices().length; i++) {
dbQuestion.addToData(ObQuestionDatum.createNew(dc, CHOICES,
getChoices()[i], i));
}
} else {
//update the one we've got
dbQuestion.getValue(TEXT).setText(getText());
dbQuestion.getValue(EXPLANATION).setText(getExplanation());
dbQuestion.getValue(CORRECT_NUMBER).setNumericValue
(getCorrectNumber());
List<ObQuestionDatum> dbChoices =
dbQuestion.getValues(CHOICES);
for (ObQuestionDatum choice : dbChoices) {
choice.setText(getChoices()[choice.getNumericValue()]);
}
}
dbQuestion.setLastModified(new Date());
dbQuestion.getDataContext().commitChanges();
} catch (ValidationException e) {
System.out.println(getAuthor());
Iterator it =
e.getValidationResult().getFailures().iterator();
while(it.hasNext()) {
ValidationFailure f = (ValidationFailure)
it.next();
Object source = f.getSource();
System.out.println(source);
}
}
}
Here are the results of the print statements, with labels:
This is the first print, the result of getAuthor()
{<ObjectId:User, id=221>; hollow; []}
This is getAuthor() after setting the value in the database
{<ObjectId:User, id=221>; new; [toUserPages=>?; organizations=>?;
studentSections=>?; toOutMessages=>?; exchanges=>?; toAssignments=>?;
teacherSections=>?; files=>?; toSkins=>?; groups=>?;
studentForums=>?; obligations=>?; toInMessages=>?; toGrades=>?;
toTardys=>?; absences=>?; teacherForums=>?; messages=>?; toAnswers=>?]}
These are all the problems from iterating through the
ValidationException
{<ObjectId:User, id=221>; new; [toUserPages=>?; organizations=>?;
studentSections=>?; toOutMessages=>?; exchanges=>?; toAssignments=>?;
teacherSections=>?; files=>?; toSkins=>?; groups=>?;
studentForums=>?; obligations=>?; toInMessages=>?; toGrades=>?;
toTardys=>?; absences=>?; teacherForums=>?; messages=>?; toAnswers=>?]}
{<ObjectId:User, id=221>; new; [toUserPages=>?; organizations=>?;
studentSections=>?; toOutMessages=>?; exchanges=>?; toAssignments=>?;
teacherSections=>?; files=>?; toSkins=>?; groups=>?;
studentForums=>?; obligations=>?; toInMessages=>?; toGrades=>?;
toTardys=>?; absences=>?; teacherForums=>?; messages=>?; toAnswers=>?]}
{<ObjectId:User, id=221>; new; [toUserPages=>?; organizations=>?;
studentSections=>?; toOutMessages=>?; exchanges=>?; toAssignments=>?;
teacherSections=>?; files=>?; toSkins=>?; groups=>?;
studentForums=>?; obligations=>?; toInMessages=>?; toGrades=>?;
toTardys=>?; absences=>?; teacherForums=>?; messages=>?; toAnswers=>?]}
{<ObjectId:User, id=221>; new; [toUserPages=>?; organizations=>?;
studentSections=>?; toOutMessages=>?; exchanges=>?; toAssignments=>?;
teacherSections=>?; files=>?; toSkins=>?; groups=>?;
studentForums=>?; obligations=>?; toInMessages=>?; toGrades=>?;
toTardys=>?; absences=>?; teacherForums=>?; messages=>?; toAnswers=>?]}
{<ObjectId:User, id=221>; new; [toUserPages=>?; organizations=>?;
studentSections=>?; toOutMessages=>?; exchanges=>?; toAssignments=>?;
teacherSections=>?; files=>?; toSkins=>?; groups=>?;
studentForums=>?; obligations=>?; toInMessages=>?; toGrades=>?;
toTardys=>?; absences=>?; teacherForums=>?; messages=>?; toAnswers=>?]}
{<ObjectId:User, id=221>; new; [toUserPages=>?; organizations=>?;
studentSections=>?; toOutMessages=>?; exchanges=>?; toAssignments=>?;
teacherSections=>?; files=>?; toSkins=>?; groups=>?;
studentForums=>?; obligations=>?; toInMessages=>?; toGrades=>?;
toTardys=>?; absences=>?; teacherForums=>?; messages=>?; toAnswers=>?]}
As I look at the code, could the problem be that the author and the
dbQuestion are in different DataContexts? If so, I thought I'd get an
error about not being able to set getAuthor() as a relationship, but
that would explain why refetching into this DataContext works. (As I
said before, the DataContext is stored as a Session variable per
user, so I can't figure out how I'm getting multiple DataContexts for
one user.)
What am I doing wrong?????
TIA,
Todd
This archive was generated by hypermail 2.0.0 : Tue Feb 21 2006 - 11:15:51 EST